From f5a0baaa38f73bc005ff84c73dc6d4b06eeab794 Mon Sep 17 00:00:00 2001 From: Yasin Date: Tue, 16 May 2017 09:16:41 +0530 Subject: [PATCH 01/10] BAEL-900 Guide to dynamic tests in Junit 5 --- .../com/baeldung/DynamicTestsExample.java | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 junit5/src/test/java/com/baeldung/DynamicTestsExample.java diff --git a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java new file mode 100644 index 000000000000..bf33a0ba7ad8 --- /dev/null +++ b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java @@ -0,0 +1,129 @@ +package com.baeldung; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; +import org.junit.jupiter.api.function.ThrowingConsumer; + +public class DynamicTestsExample { + + @TestFactory + Collection dynamicTestsWithCollection() { + return Arrays.asList( + DynamicTest.dynamicTest("Add test", () -> assertEquals(2, Math.addExact(1, 1))), + DynamicTest.dynamicTest("Multiply Test", () -> assertEquals(4, Math.multiplyExact(2, 2)))); + } + + @TestFactory + Iterable dynamicTestsWithIterable() { + return Arrays.asList( + DynamicTest.dynamicTest("Add test", () -> assertEquals(2, Math.addExact(1, 1))), + DynamicTest.dynamicTest("Multiply Test", () -> assertEquals(4, Math.multiplyExact(2, 2)))); + } + + @TestFactory + Iterator dynamicTestsWithIterator() { + return Arrays.asList( + DynamicTest.dynamicTest("Add test", () -> assertEquals(2, Math.addExact(1, 1))), + DynamicTest.dynamicTest("Multiply Test", () -> assertEquals(4, Math.multiplyExact(2, 2)))) + .iterator(); + } + + @TestFactory + Stream dynamicTestsFromIntStream() { + return IntStream.iterate(0, n -> n + 2).limit(10).mapToObj( + n -> DynamicTest.dynamicTest("test" + n, () -> assertTrue(n % 2 == 0))); + } + + @TestFactory + Stream dynamicTestsFromStream() { + + // sample input and output + List inputList = + new ArrayList<>(Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com")); + List outputList = + new ArrayList<>(Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156")); + + // input generator that generates inputs using inputList + Iterator inputGenerator = new Iterator() { + + String current; + int size = inputList.size(); + int index = 0; + + @Override + public boolean hasNext() { + if(index == size) { + return false; + } + current = inputList.get(index); + index++; + return true; + } + + @Override + public String next() { + return current; + } + }; + + // a display name generator that creates a different name based on the input + Function displayNameGenerator = (input) -> "Resolving: " + input; + + // the test executor, which actually has the logic of how to execute the test case + DomainNameResolver resolver = new DomainNameResolver(); + ThrowingConsumer testExecutor = (input) -> { + int id = inputList.indexOf(input); + assertEquals(outputList.get(id), resolver.resolveDomain(input)); + }; + + // combine everything and return a Stream of DynamicTest + return DynamicTest.stream(inputGenerator, displayNameGenerator, testExecutor); + } + + @TestFactory + Stream dynamicTestsFromStreamInJava8() { + + DomainNameResolver resolver = new DomainNameResolver(); + + List inputList = + new ArrayList<>(Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com")); + List outputList = + new ArrayList<>(Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156")); + + return inputList.stream().map(dom -> DynamicTest.dynamicTest("Resolving: " + dom, () -> { + int id = inputList.indexOf(dom); + assertEquals(outputList.get(id), resolver.resolveDomain(dom)); + })); + + } + + class DomainNameResolver { + + private Map ipByDomainName = new HashMap<>(); + + DomainNameResolver() { + this.ipByDomainName.put("www.somedomain.com", "154.174.10.56"); + this.ipByDomainName.put("www.anotherdomain.com", "211.152.104.132"); + this.ipByDomainName.put("www.yetanotherdomain.com", "178.144.120.156"); + } + + public String resolveDomain(String domainName) { + return ipByDomainName.get(domainName); + } + } + +} From d0d45c9067223347da20d0f2c80de391fcade38e Mon Sep 17 00:00:00 2001 From: Yasin Date: Fri, 19 May 2017 21:25:17 +0530 Subject: [PATCH 02/10] BAEL-900 Guide to Dynamic Tests in Junit 5 --- .../src/test/java/com/baeldung/DynamicTestsExample.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java index bf33a0ba7ad8..e02e01eea005 100644 --- a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java +++ b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java @@ -1,7 +1,7 @@ package com.baeldung; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; import java.util.Arrays; @@ -17,6 +17,8 @@ import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import org.junit.jupiter.api.function.ThrowingConsumer; +import org.junit.platform.runner.JUnitPlatform; +import org.junit.runner.RunWith; public class DynamicTestsExample { @@ -100,9 +102,9 @@ Stream dynamicTestsFromStreamInJava8() { DomainNameResolver resolver = new DomainNameResolver(); List inputList = - new ArrayList<>(Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com")); + Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com"); List outputList = - new ArrayList<>(Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156")); + Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156"); return inputList.stream().map(dom -> DynamicTest.dynamicTest("Resolving: " + dom, () -> { int id = inputList.indexOf(dom); From 8dc2545b4987cf9975d6c3991dfa8b391b32d838 Mon Sep 17 00:00:00 2001 From: Yasin Date: Fri, 19 May 2017 21:25:38 +0530 Subject: [PATCH 03/10] Revert "BAEL-900 Guide to Dynamic Tests in Junit 5" This reverts commit d0d45c9067223347da20d0f2c80de391fcade38e. --- .../src/test/java/com/baeldung/DynamicTestsExample.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java index e02e01eea005..bf33a0ba7ad8 100644 --- a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java +++ b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java @@ -1,7 +1,7 @@ package com.baeldung; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.ArrayList; import java.util.Arrays; @@ -17,8 +17,6 @@ import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import org.junit.jupiter.api.function.ThrowingConsumer; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; public class DynamicTestsExample { @@ -102,9 +100,9 @@ Stream dynamicTestsFromStreamInJava8() { DomainNameResolver resolver = new DomainNameResolver(); List inputList = - Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com"); + new ArrayList<>(Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com")); List outputList = - Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156"); + new ArrayList<>(Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156")); return inputList.stream().map(dom -> DynamicTest.dynamicTest("Resolving: " + dom, () -> { int id = inputList.indexOf(dom); From 2489dcc9c0ae311f9235f348521f7aca15ed412e Mon Sep 17 00:00:00 2001 From: Yasin Date: Fri, 19 May 2017 21:27:57 +0530 Subject: [PATCH 04/10] BAEL-900 Guide to Dynamic Tests in Junit 5 --- junit5/src/test/java/com/baeldung/DynamicTestsExample.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java index bf33a0ba7ad8..ce1f8b16a73a 100644 --- a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java +++ b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java @@ -1,7 +1,7 @@ package com.baeldung; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; import java.util.Arrays; @@ -100,9 +100,9 @@ Stream dynamicTestsFromStreamInJava8() { DomainNameResolver resolver = new DomainNameResolver(); List inputList = - new ArrayList<>(Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com")); + Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com"); List outputList = - new ArrayList<>(Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156")); + Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156"); return inputList.stream().map(dom -> DynamicTest.dynamicTest("Resolving: " + dom, () -> { int id = inputList.indexOf(dom); From 5f2a4a112546a09ddad379ba4bebeaa38794a932 Mon Sep 17 00:00:00 2001 From: Yasin Date: Thu, 25 May 2017 23:48:35 +0530 Subject: [PATCH 05/10] BAEL-900 Guide to dynamic tests in Junit 5 --- .../com/baeldung/DynamicTestsExample.java | 29 ++++++++++++++ .../java/com/baeldung/helpers/Employee.java | 38 +++++++++++++++++++ .../com/baeldung/helpers/EmployeeDao.java | 16 ++++++++ 3 files changed, 83 insertions(+) create mode 100644 junit5/src/test/java/com/baeldung/helpers/Employee.java create mode 100644 junit5/src/test/java/com/baeldung/helpers/EmployeeDao.java diff --git a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java index ce1f8b16a73a..a7c88bb1d065 100644 --- a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java +++ b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java @@ -17,7 +17,13 @@ import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import org.junit.jupiter.api.function.ThrowingConsumer; +import org.junit.platform.runner.JUnitPlatform; +import org.junit.runner.RunWith; +import com.baeldung.helpers.Employee; +import com.baeldung.helpers.EmployeeDao; + +@RunWith(JUnitPlatform.class) public class DynamicTestsExample { @TestFactory @@ -111,6 +117,29 @@ Stream dynamicTestsFromStreamInJava8() { } + @TestFactory + Stream dynamicTestsForEmployeeWorkflows() { + List inputList = + Arrays.asList(new Employee(1, "Fred"), new Employee(2), new Employee(3, "John")); + + EmployeeDao dao = new EmployeeDao(); + Stream saveEmployeeStream = inputList.stream().map(emp -> + DynamicTest.dynamicTest("saveEmployee: " + emp.toString(), () -> { + Employee returned = dao.save(emp.getId()); + assertEquals(returned.getId(), emp.getId()); + })); + + Stream saveEmployeeWithFirstNameStream + = inputList.stream().filter(emp -> !emp.getFirstName().isEmpty()) + .map(emp -> DynamicTest.dynamicTest("saveEmployeeWithName" + emp.toString(), () -> { + Employee returned = dao.save(emp.getId(), emp.getFirstName()); + assertEquals(returned.getId(), emp.getId()); + assertEquals(returned.getFirstName(), emp.getFirstName()); + })); + + return Stream.concat(saveEmployeeStream, saveEmployeeWithFirstNameStream); + } + class DomainNameResolver { private Map ipByDomainName = new HashMap<>(); diff --git a/junit5/src/test/java/com/baeldung/helpers/Employee.java b/junit5/src/test/java/com/baeldung/helpers/Employee.java new file mode 100644 index 000000000000..7fa724e4a846 --- /dev/null +++ b/junit5/src/test/java/com/baeldung/helpers/Employee.java @@ -0,0 +1,38 @@ +package com.baeldung.helpers; + +public class Employee { + + private long id; + private String firstName; + + public Employee(long id) { + this.id = id; + this.firstName = ""; + } + + public Employee(long id, String firstName) { + this.id = id; + this.firstName = firstName; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + @Override + public String toString() { + return "Employee [id=" + id + ", firstName=" + firstName + "]"; + } +} diff --git a/junit5/src/test/java/com/baeldung/helpers/EmployeeDao.java b/junit5/src/test/java/com/baeldung/helpers/EmployeeDao.java new file mode 100644 index 000000000000..b23e5bf5e385 --- /dev/null +++ b/junit5/src/test/java/com/baeldung/helpers/EmployeeDao.java @@ -0,0 +1,16 @@ +package com.baeldung.helpers; + +public class EmployeeDao { + + public Employee save(long id) { + return new Employee(id); + } + + public Employee save(long id, String firstName) { + return new Employee(id, firstName); + } + + public Employee update(Employee employee) { + return employee; + } +} From 59e3c1718a7483e66f6122b3ef046d02d0db52a0 Mon Sep 17 00:00:00 2001 From: Yasin Date: Thu, 25 May 2017 23:53:04 +0530 Subject: [PATCH 06/10] removed unnecessary annotation --- junit5/src/test/java/com/baeldung/DynamicTestsExample.java | 1 - 1 file changed, 1 deletion(-) diff --git a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java index a7c88bb1d065..33746f171de2 100644 --- a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java +++ b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java @@ -23,7 +23,6 @@ import com.baeldung.helpers.Employee; import com.baeldung.helpers.EmployeeDao; -@RunWith(JUnitPlatform.class) public class DynamicTestsExample { @TestFactory From 87006d1ad9b710296874b632aded1ad94f88db5a Mon Sep 17 00:00:00 2001 From: Yasin Date: Fri, 26 May 2017 08:17:59 +0530 Subject: [PATCH 07/10] BAEL-900 unused imports removed --- junit5/src/test/java/com/baeldung/DynamicTestsExample.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java index 33746f171de2..6a97f2347be7 100644 --- a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java +++ b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java @@ -17,8 +17,6 @@ import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import org.junit.jupiter.api.function.ThrowingConsumer; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; import com.baeldung.helpers.Employee; import com.baeldung.helpers.EmployeeDao; From 5a2fafe9fef837dd0bbe062f1811a5e5366915c3 Mon Sep 17 00:00:00 2001 From: Yasin Date: Sat, 27 May 2017 18:39:32 +0530 Subject: [PATCH 08/10] BAEL-900 simplified input generator code --- .../com/baeldung/DynamicTestsExample.java | 27 +++---------------- 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java index 6a97f2347be7..fd6bb3e0a81d 100644 --- a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java +++ b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java @@ -3,7 +3,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; @@ -56,32 +55,12 @@ Stream dynamicTestsFromStream() { // sample input and output List inputList = - new ArrayList<>(Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com")); + Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com"); List outputList = - new ArrayList<>(Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156")); + Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156"); // input generator that generates inputs using inputList - Iterator inputGenerator = new Iterator() { - - String current; - int size = inputList.size(); - int index = 0; - - @Override - public boolean hasNext() { - if(index == size) { - return false; - } - current = inputList.get(index); - index++; - return true; - } - - @Override - public String next() { - return current; - } - }; + Iterator inputGenerator = inputList.iterator(); // a display name generator that creates a different name based on the input Function displayNameGenerator = (input) -> "Resolving: " + input; From 49d194ae249aa59acfe6e658b6279f6de7de0cda Mon Sep 17 00:00:00 2001 From: Yasin Date: Sun, 11 Jun 2017 20:18:16 +0530 Subject: [PATCH 09/10] BAEL-252 A Java Client to consume a WebSockets API --- .../baeldung/websocket/client/StompClient.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/spring-boot/src/main/java/org/baeldung/websocket/client/StompClient.java b/spring-boot/src/main/java/org/baeldung/websocket/client/StompClient.java index da2dbeac3d36..71f5471fb114 100644 --- a/spring-boot/src/main/java/org/baeldung/websocket/client/StompClient.java +++ b/spring-boot/src/main/java/org/baeldung/websocket/client/StompClient.java @@ -1,20 +1,15 @@ package org.baeldung.websocket.client; -import java.util.Collections; -import java.util.List; import java.util.Scanner; import org.springframework.messaging.converter.MappingJackson2MessageConverter; import org.springframework.messaging.simp.stomp.StompSessionHandler; +import org.springframework.web.socket.client.WebSocketClient; import org.springframework.web.socket.client.standard.StandardWebSocketClient; import org.springframework.web.socket.messaging.WebSocketStompClient; -import org.springframework.web.socket.sockjs.client.SockJsClient; -import org.springframework.web.socket.sockjs.client.Transport; -import org.springframework.web.socket.sockjs.client.WebSocketTransport; /** * Stand alone WebSocketStompClient. - * @author Kalyan * */ public class StompClient { @@ -22,13 +17,11 @@ public class StompClient { private static String URL = "ws://localhost:8080/spring-mvc-java/chat"; public static void main(String[] args) { - Transport webSocketTransport = new WebSocketTransport(new StandardWebSocketClient()); - List transports = Collections.singletonList(webSocketTransport); - SockJsClient sockJsClient = new SockJsClient(transports); - - WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient); + WebSocketClient client = new StandardWebSocketClient(); + WebSocketStompClient stompClient = new WebSocketStompClient(client); + stompClient.setMessageConverter(new MappingJackson2MessageConverter()); - + StompSessionHandler sessionHandler = new MyStompSessionHandler(); stompClient.connect(URL, sessionHandler); From 598b76c910567cd27fb3e427222c36ce2afd41e5 Mon Sep 17 00:00:00 2001 From: Yasin Bhojawala Date: Sun, 30 Jul 2017 16:07:06 +0530 Subject: [PATCH 10/10] BAEL-887 How to collect a Java Stream to an immutable collection? --- core-java/pom.xml | 2 +- .../stream/StreamToImmutableTest.java | 69 +++++++++++++++++++ .../MyImmutableListCollector.java | 22 ++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 core-java/src/test/java/com/baeldung/stream/StreamToImmutableTest.java create mode 100644 core-java/src/test/java/com/baeldung/stream/mycollectors/MyImmutableListCollector.java diff --git a/core-java/pom.xml b/core-java/pom.xml index 2267dba1e6f4..10479fe39f83 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -375,7 +375,7 @@ 1.1.7 - 21.0 + 22.0 3.5 1.55 1.10 diff --git a/core-java/src/test/java/com/baeldung/stream/StreamToImmutableTest.java b/core-java/src/test/java/com/baeldung/stream/StreamToImmutableTest.java new file mode 100644 index 000000000000..d267bd640681 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/stream/StreamToImmutableTest.java @@ -0,0 +1,69 @@ +package com.baeldung.stream; + +import static java.util.stream.Collectors.collectingAndThen; +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toSet; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.IntStream; + +import org.junit.Test; + +import com.baeldung.stream.mycollectors.MyImmutableListCollector; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; + +public class StreamToImmutableTest { + + @Test + public void whenUsingCollectingToImmutableSet_thenSuccess() { + Set mutableSet = new HashSet<>(Arrays.asList("a", "b", "c")); + mutableSet.add("test"); + Set immutableSet = mutableSet.stream() + .collect(collectingAndThen(toSet(), ImmutableSet::copyOf)); + + System.out.println(immutableSet.getClass()); + } + + @Test + public void whenUsingCollectingToUnmodifiableList_thenSuccess() { + List givenList = new ArrayList<>(Arrays.asList("a", "b", "c")); + List result = givenList.stream() + .collect(collectingAndThen(toList(), Collections::unmodifiableList)); + + System.out.println(result.getClass()); + } + + @Test + public void whenCollectToImmutableList_thenSuccess() { + List list = IntStream.range(0, 9) + .boxed() + .collect(ImmutableList.toImmutableList()); + + System.out.println(list.getClass()); + } + + @Test + public void whenCollectToMyImmutableListCollector_thenSuccess() { + List givenList = Arrays.asList("a", "b", "c", "d"); + List result = givenList.stream() + .collect(MyImmutableListCollector.toImmutableList()); + + System.out.println(result.getClass()); + } + + @Test + public void whenPassingSupplier_thenSuccess() { + List givenList = Arrays.asList("a", "b", "c", "d"); + List result = givenList.stream() + .collect(MyImmutableListCollector.toImmutableList(LinkedList::new)); + + System.out.println(result.getClass()); + } +} diff --git a/core-java/src/test/java/com/baeldung/stream/mycollectors/MyImmutableListCollector.java b/core-java/src/test/java/com/baeldung/stream/mycollectors/MyImmutableListCollector.java new file mode 100644 index 000000000000..cf6b3601c393 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/stream/mycollectors/MyImmutableListCollector.java @@ -0,0 +1,22 @@ +package com.baeldung.stream.mycollectors; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Supplier; +import java.util.stream.Collector; + +public class MyImmutableListCollector { + + public static > Collector> toImmutableList(Supplier supplier) { + return Collector.of(supplier, List::add, (left, right) -> { + left.addAll(right); + return left; + }, Collections::unmodifiableList); + } + + public static Collector, List> toImmutableList() { + return toImmutableList(ArrayList::new); + } + +}