In Java 10, following new methods have been added to java.util.stream.Collectors which input elements into an unmodifiable List/Set/Map. The resultant unmodifiable collections are created with the same characteristic as if they are created via copyOf() methods (last tutorial)
Followings are the new methods:
Collector<T, ?, List<T>> toUnmodifiableList()
Collector<T, ?, Set<T>> toUnmodifiableSet()
Collector<T, ?, Map<K,U>> toUnmodifiableMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper)
Collector<T, ?, Map<K,U>> toUnmodifiableMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction)
Examples
Collectors.toUnmodifiableList()
public class ToUnmodifiableListExample {
public static void main(String[] args) {
List<Integer> list = IntStream.range(1, 5)
.boxed()
.collect(Collectors.toUnmodifiableList());
System.out.println(list);
System.out.println(list.getClass().getName());
}
} [1, 2, 3, 4] java.util.ImmutableCollections$ListN
Collectors.toUnmodifiableSet()
public class ToUnmodifiableSetExample {
public static void main(String[] args) {
Set<Integer> set = IntStream.range(1, 5)
.boxed()
.collect(Collectors.toUnmodifiableSet());
System.out.println(set);
System.out.println(set.getClass().getTypeName());
}
} [4, 1, 2, 3] java.util.ImmutableCollections$SetN
Collectors.toUnmodifiableMap()
There are two methods:
Collector<T, ?, Map<K,U>> toUnmodifiableMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper)
public class ToUnmodifiableMapExample {
public static void main(String[] args) {
Map<Integer, Double> map =
IntStream.range(1, 5)
.boxed()
.collect(Collectors.toUnmodifiableMap(
i -> i,
i -> Math.pow(i, 3))
);
System.out.println(map);
System.out.println(map.getClass().getTypeName());
}
} {4=64.0, 1=1.0, 3=27.0, 2=8.0} java.util.ImmutableCollections$MapN
Here's the second method:
Collector<T, ?, Map<K,U>> toUnmodifiableMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction)
The mergeFunction is used to resolve collisions between values associated with the same key. Here's an example
public class ToUnmodifiableMapMergeExample {
public static void main(String[] args) {
Map<Integer, List<String>> map =
Stream.of("rover", "joyful", "depth", "hunter")
.collect(Collectors.toUnmodifiableMap(
String::length,
List::of,
ToUnmodifiableMapMergeExample::mergeFunction)
);
System.out.println(map);
}
private static List<String> mergeFunction(List<String> l1, List<String> l2) {
List<String> list = new ArrayList<>();
list.addAll(l1);
list.addAll(l2);
return list;
}
} {6=[joyful, hunter], 5=[rover, depth]}
Example ProjectDependencies and Technologies Used: |