From 7135047ba1ee35b1cec031a7e653fd68426a0806 Mon Sep 17 00:00:00 2001 From: maenolis Date: Wed, 15 Nov 2023 08:33:33 +0200 Subject: [PATCH] Initial commit for lazy lambda article --- core-java-modules/core-java-21/pom.xml | 13 +++++++-- .../baeldung/lazylambda/LambdaSupplier.java | 16 ++++++++++ .../lazylambda/LazyLambdaSupplier.java | 22 ++++++++++++++ .../LazyLambdaThreadSafeSupplier.java | 29 +++++++++++++++++++ .../lazylambda/LambdaSupplierUnitTest.java | 24 +++++++++++++++ .../LazyLambdaSupplierUnitTest.java | 23 +++++++++++++++ .../LazyLambdaThreadSafeSupplierUnitTest.java | 23 +++++++++++++++ 7 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java create mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java create mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java create mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java 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(); + } + +}