diff --git a/core-java/pom.xml b/core-java/pom.xml
index 78338fc439..73b1c22ed8 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -391,7 +391,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 0000000000..d267bd6406
--- /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 0000000000..cf6b3601c3
--- /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);
+ }
+
+}