为什么toList()不直接存在于Java 8 Stream上

Mri*_*nal 4 java java-8 java-stream

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

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

fge*_*fge 5

因为你不知道List实现是什么样的:

  • 会不可变?
  • 你能改变它的大小吗?
  • 等等

事实上,甚至Collectors.toList()不保证:

返回的List的类型,可变性,可序列化或线程安全性无法保证; 如果需要更多地控制返回的List,请使用toCollection(Supplier).

因此,提供通用.toList()方法适合某些人的一些用法,但它永远不能适合所有人的所有用法.当然,这同样适用Collectors.toSet().

然而,数组不是问题:你知道你可以用它们做什么.

  • 为什么此参数适用于不具有`toList` Stream`方法,而不适用于具有`toList()`Collector在Stream的`collect`方法中使用? (2认同)
  • @Eran很好,另一个原因是,根据`Stream`实现,你可能会返回具有不同特征的列表,除非方法的合同定义得很好.因此,这个决定是有道理的. (2认同)