为什么toList()不直接在Java8流上
我知道Java8Stream提供了为什么toList()不直接在Java8流上,java,java-8,java-stream,Java,Java 8,Java Stream,我知道Java8Stream提供了.collect方法来将流转换为我们所选择的任何集合/数据结构,它本质上非常通用。了解流可能来自非集合对象/资源。但从使用角度来看,将流转换为列表/集是非常自然的 流已经提供了toArray()方法来转换为数组,所以为什么不toList()和toSet()?因为您不知道列表的实现是什么样的: 它是可变的吗 你能改变它的尺寸吗 等等 事实上: 无法保证返回列表的类型、可变性、序列化性或线程安全性;如果需要对返回的列表进行更多控制,请使用收集(供应商) 因此,提
.collect
方法来将流转换为我们所选择的任何集合/数据结构,它本质上非常通用。了解流可能来自非集合对象/资源。但从使用角度来看,将流转换为列表/集是非常自然的
流已经提供了
toArray()
方法来转换为数组,所以为什么不toList()
和toSet()
?因为您不知道列表的实现是什么样的:
- 它是可变的吗
- 你能改变它的尺寸吗
- 等等
事实上:
无法保证返回列表的类型、可变性、序列化性或线程安全性;如果需要对返回的列表进行更多控制,请使用收集(供应商)
因此,提供一个通用的.toList()
方法将适合某些人的某些用法,但它永远无法适合所有人的所有用法。当然,这同样适用于收集器.toSet()
不过,阵列不是问题:您知道如何使用它们。是密切相关的。它是界面污染和易用性之间的折衷。他们选择不再污染界面。添加toList()也需要一个toSet()方法,然后是toMap()等,最终重复了收集器的许多方法,使流接口更加复杂,并被许多收集方法“污染”。
toArray()
方法也可以很容易地实现为Collector
。我猜,出于效率原因,它直接添加到流接口中:如果流的大小合适,您可以利用它预先分配精确大小的数组。这对于收集器来说目前是不可能的:他们无法提前获得流的大小。有一个方法可以解决这个问题,尽管在这个方向上似乎还没有做任何工作。@TagirValeev我有一个关于.toArray
的相关问题。为什么它返回Object[]
,而不是T[]
?为什么这个论点不适用于toList
流
方法,而不适用于流的collect
方法中使用toList()
收集器,另一个原因是,根据流
实现,您可能会返回具有不同特征的列表,除非方法的契约定义良好。因此,这个决定对我来说是有意义的。