Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么toList()不直接在Java8流上_Java_Java 8_Java Stream - Fatal编程技术网

为什么toList()不直接在Java8流上

为什么toList()不直接在Java8流上,java,java-8,java-stream,Java,Java 8,Java Stream,我知道Java8Stream提供了.collect方法来将流转换为我们所选择的任何集合/数据结构,它本质上非常通用。了解流可能来自非集合对象/资源。但从使用角度来看,将流转换为列表/集是非常自然的 流已经提供了toArray()方法来转换为数组,所以为什么不toList()和toSet()?因为您不知道列表的实现是什么样的: 它是可变的吗 你能改变它的尺寸吗 等等 事实上: 无法保证返回列表的类型、可变性、序列化性或线程安全性;如果需要对返回的列表进行更多控制,请使用收集(供应商) 因此,提

我知道Java8Stream提供了
.collect
方法来将流转换为我们所选择的任何集合/数据结构,它本质上非常通用。了解流可能来自非集合对象/资源。但从使用角度来看,将流转换为列表/集是非常自然的


流已经提供了
toArray()
方法来转换为数组,所以为什么不
toList()
toSet()

因为您不知道
列表的实现是什么样的:

  • 它是可变的吗
  • 你能改变它的尺寸吗
  • 等等
事实上:

无法保证返回列表的类型、可变性、序列化性或线程安全性;如果需要对返回的列表进行更多控制,请使用收集(供应商)

因此,提供一个通用的
.toList()
方法将适合某些人的某些用法,但它永远无法适合所有人的所有用法。当然,这同样适用于收集器.toSet()


不过,阵列不是问题:您知道如何使用它们。

是密切相关的。它是界面污染和易用性之间的折衷。他们选择不再污染界面。添加toList()也需要一个toSet()方法,然后是toMap()等,最终重复了收集器的许多方法,使流接口更加复杂,并被许多收集方法“污染”。
toArray()
方法也可以很容易地实现为
Collector
。我猜,出于效率原因,它直接添加到流接口中:如果流的大小合适,您可以利用它预先分配精确大小的数组。这对于收集器来说目前是不可能的:他们无法提前获得流的大小。有一个方法可以解决这个问题,尽管在这个方向上似乎还没有做任何工作。@TagirValeev我有一个关于
.toArray
的相关问题。为什么它返回
Object[]
,而不是
T[]
?为什么这个论点不适用于
toList
方法,而不适用于流的
collect
方法中使用
toList()
收集器,另一个原因是,根据
实现,您可能会返回具有不同特征的列表,除非方法的契约定义良好。因此,这个决定对我来说是有意义的。