如何使用Unmodifiable
创建Collectors.toList/toSet/toMap
列表/集/地图,因为toList
(等)的文档为:
返回的List的类型,可变性,可序列化或线程安全性无法保证
在java-10之前,你必须提供Function
和Collectors.collectingAndThen
,例如:
List<Integer> result = Arrays.asList(1, 2, 3, 4)
.stream()
.collect(Collectors.collectingAndThen(
Collectors.toList(),
x -> Collections.unmodifiableList(x)));
使用Java 10,这更容易,更易读:
List<Integer> result = Arrays.asList(1, 2, 3, 4)
.stream()
.collect(Collectors.toUnmodifiableList());
在内部,它与Collectors.collectingAndThen
相同,但返回Java 9中添加的不可修改的List
实例。
此外,要清除两个(collectingAndThen
与toUnmodifiableList
)实现之间的文档差异:
Collectors.toUnmodifiableList
会返回一个不允许空值的收集器,如果它带有NullPointerException
值,则会抛出null
。
static void additionsToCollector() {
// this works fine unless you try and operate on the null element
var previous = Stream.of(1, 2, 3, 4, null)
.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
// next up ready to face an NPE
var current = Stream.of(1, 2, 3, 4, null).collect(Collectors.toUnmodifiableList());
}
而且,这是因为前者构造了Collections.UnmodifiableRandomAccessList
的一个实例,而后者构造了ImmutableCollections.ListN
的一个实例,它添加到static factory methods.带到桌子的属性列表中