【发布时间】:2015-10-08 16:26:18
【问题描述】:
我了解 Java 8 Stream 提供了.collect 方法来将 Stream 转换为我们选择的任何集合/数据结构,它本质上是非常通用的。了解 Stream 可能来自非集合对象/资源。但是从使用的角度来看,将 Stream 转换为 List / Set 是很自然的。
Stream 已经提供了toArray() 转换为数组的方法,那为什么不提供toList() 和toSet() 呢?
【问题讨论】:
-
这是界面污染和易用性之间的折衷。他们选择不更多地污染界面。添加 toList() 也会要求 toSet() 方法,然后是 toMap() 等,最终重复收集器的许多方法,并使 Stream 接口更加复杂和“污染”许多收集方法。
-
toArray()方法也可以很容易地实现为Collector。我想,出于效率原因,它直接添加到 Stream 接口:如果您的 Stream 已调整大小,您可以利用它预先分配精确大小的数组。这对于收集器来说目前是不可能的:他们无法提前获得流的大小。有一个 request 来解决这个问题,尽管在这个方向上似乎还没有做任何工作。 -
@TagirValeev 我有一个关于
.toArray的相关问题。为什么它返回Object[],而不是T[]?
标签: java java-8 java-stream