如何使用Unmodifiable创建Collectors.toList/toSet/toMap列表/Set/Map,因为toList (以及类似的)文档如下:
对于返回的列表的类型、可更改性、可序列化性或线程安全性没有任何保证。
在java-10之前,您必须提供一个带有Function的Collectors.collectingAndThen,例如:
List<Integer> result = Arrays.asList(1, 2, 3, 4)
.stream()
.collect(Collectors.collectingAndThen(
Collectors.toList(),
x -> Collections.unmodifiableList(x)));发布于 2018-03-05 09:06:29
使用Java 10,这要容易得多,而且可读性要强得多:
List<Integer> result = Arrays.asList(1, 2, 3, 4)
.stream()
.collect(Collectors.toUnmodifiableList());在内部,它与Collectors.collectingAndThen相同,但返回一个不可修改的List实例,该实例是在Java9中添加的。
发布于 2018-03-05 10:10:35
此外,为了消除这两种(collectingAndThen与toUnmodifiableList)实现之间的文档差异:
null将返回一个不允许空值的收集器,如果它显示了一个Collectors.toUnmodifiableList值,它将抛出NullPointerException。
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的实例,该实例添加了静态工厂方法。表中的属性列表
发布于 2021-01-19 11:34:47
Stream#toList
Java 16在Stream接口上添加了一个方法:toList()。引用Javadoc:
返回的
List是不可修改的;对任何mutator方法的调用都会导致抛出UnsupportedOperationException。
这种方法不仅比Collectors更方便,而且有一些好处,比如在并行流上的性能更好。
特别是使用并行() --因为它避免了结果复制。Benchmark是在100 K长流上的几个简单操作。

欲进一步阅读,请访问:http://marxsoftware.blogspot.com/2020/12/jdk16-stream-to-list.html
在简历中,链接声明如下所示。
理解:进入一个人的代码库并使用stream.toList()作为stream.collect(Collectors.toList())的替代可能很有诱惑力,但是如果代码对返回ArrayList的stream.collect(Collectors.toList())的实现有直接或间接的依赖,那么行为可能会有所不同。stream.collect(Collectors.toList())和stream.toList()返回的列表之间的一些关键区别在本文的其余部分中得到了说明。 Collectors.toList()的基于Javadoc的文档声明(重点是后加的),“返回一个收集器,它将输入元素累加到一个新列表中。返回的列表的类型、可变性、可序列化性或线程安全性没有保证.”虽然Collectors.toList()提供的列表中的“类型、可变性、可序列化性或线程安全性”没有保证,但预计有些人可能已经意识到它目前是一个ArrayList,并以依赖于ArrayList特性的方式使用它。
我所理解的是,Stream.toList()它将导致一个不可变的列表。
Stream.toList()提供了一个不可变的列表实现(不能添加或排序的类型ImmutableCollections.ListN ),类似于List.of()提供的列表实现,并且与Stream.collect(Collectors.toList())提供的可变(可以更改和排序) ArrayList相反。根据Stream.collect返回的Stream.collect(Collectors.toList())返回的代码的变化能力,任何现有代码都将不能使用Stream.toList(),并且会引发UnsupportedOperationException。 虽然Stream.collect(Collectors.toList())和Stream.toList()返回的列表的实现性质非常不同,但它们仍然实现了列表接口,因此当使用List.equals(Object)进行比较时,它们被认为是相等的。
这个方法将允许空,所以从Java 16开始,我们将有一个
mutable/null-friendly----->Collectors.toList()
immutable/null-friendly--->Stream.toList()
immutable/null-hostile---->Collectors.toUnmodifiableList() //Naughty

太棒了。
https://stackoverflow.com/questions/49106767
复制相似问题