diff --git a/core-java-modules/core-java-21/pom.xml b/core-java-modules/core-java-21/pom.xml
index bfe1cd2c78..98e73c89c0 100644
--- a/core-java-modules/core-java-21/pom.xml
+++ b/core-java-modules/core-java-21/pom.xml
@@ -22,9 +22,7 @@
21
false
-
- --enable-preview
-
+ --enable-preview
@@ -38,6 +36,15 @@
+
+
+ org.mockito
+ mockito-core
+ 5.7.0
+ test
+
+
+
21
21
diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java
new file mode 100644
index 0000000000..a9c4c78edd
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java
@@ -0,0 +1,16 @@
+package com.baeldung.lazylambda;
+
+import java.util.function.Supplier;
+
+public class LambdaSupplier {
+
+ private final Supplier expensiveData;
+
+ public LambdaSupplier(Supplier expensiveData) {
+ this.expensiveData = expensiveData;
+ }
+
+ public T getData() {
+ return expensiveData.get();
+ }
+}
diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java
new file mode 100644
index 0000000000..484fadbe90
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java
@@ -0,0 +1,22 @@
+package com.baeldung.lazylambda;
+
+import java.util.function.Supplier;
+
+public class LazyLambdaSupplier {
+
+ private final Supplier expensiveData;
+
+ private T data;
+
+ public LazyLambdaSupplier(Supplier expensiveData) {
+ this.expensiveData = expensiveData;
+ }
+
+ public T getData() {
+ if (data != null) {
+ return data;
+ }
+ return data = expensiveData.get();
+ }
+
+}
diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java
new file mode 100644
index 0000000000..27180ced7d
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java
@@ -0,0 +1,29 @@
+package com.baeldung.lazylambda;
+
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
+
+public class LazyLambdaThreadSafeSupplier {
+
+ private final Supplier expensiveData;
+
+ private final AtomicReference data;
+
+ public LazyLambdaThreadSafeSupplier(Supplier expensiveData) {
+ this.expensiveData = expensiveData;
+ data = new AtomicReference<>();
+ }
+
+ public T getData() {
+ if (data.get() == null) {
+ synchronized (data) {
+ if (data.get() == null) {
+ data.set(expensiveData.get());
+ }
+ }
+ }
+
+ return data.get();
+ }
+
+}
diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java
new file mode 100644
index 0000000000..b2d8b91043
--- /dev/null
+++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.lazylambda;
+
+import java.util.function.Supplier;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class LambdaSupplierUnitTest {
+
+ @Test
+ public void whenCalledMultipleTimes_thenShouldBeCalledMultipleTimes() {
+ @SuppressWarnings("unchecked")
+ Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class);
+ Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call");
+ LambdaSupplier testee = new LambdaSupplier<>(mockedExpensiveFunction);
+ Mockito.verify(mockedExpensiveFunction, Mockito.never()).get();
+ testee.getData();
+ testee.getData();
+ testee.getData();
+ testee.getData();
+ Mockito.verify(mockedExpensiveFunction, Mockito.times(4)).get();
+ }
+
+}
diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java
new file mode 100644
index 0000000000..37464afe2e
--- /dev/null
+++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.lazylambda;
+
+import java.util.function.Supplier;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class LazyLambdaSupplierUnitTest {
+
+ @Test
+ public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() {
+ @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class);
+ Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call");
+ LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction);
+ Mockito.verify(mockedExpensiveFunction, Mockito.never()).get();
+ testee.getData();
+ testee.getData();
+ testee.getData();
+ testee.getData();
+ Mockito.verify(mockedExpensiveFunction, Mockito.times(1)).get();
+ }
+
+}
diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java
new file mode 100644
index 0000000000..a67600c974
--- /dev/null
+++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.lazylambda;
+
+import java.util.function.Supplier;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class LazyLambdaThreadSafeSupplierUnitTest {
+
+ @Test
+ public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() {
+ @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class);
+ Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call");
+ LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction);
+ Mockito.verify(mockedExpensiveFunction, Mockito.never()).get();
+ testee.getData();
+ testee.getData();
+ testee.getData();
+ testee.getData();
+ Mockito.verify(mockedExpensiveFunction, Mockito.times(1)).get();
+ }
+
+}