是否有一种首选方式将列表流收集到一个平面列表中?

muu*_*ued 10 java java-8 java-stream

我想知道,是否有一种首选方法可以从列表流中获取包含流中所有列表元素的集合.我可以想到两种方法:

final Stream<List<Integer>> stream = Stream.empty();
final List<Integer> one = stream.collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);
final List<Integer> two = stream.flatMap(List::stream).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

第二个选项对我来说看起来更好,但我想第一个选项在并行流中效率更高.是否支持或反对这两种方法中的一种?

Hol*_*ger 9

主要区别flatMap于是中间操作.collect是一个终端操作.

所以flatMap唯一的方法来处理扁平流的项目,如果你想进行其他操作不是collect立即荷兰国际集团.

collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll)鉴于您有两个ArrayList::addAll完全不同语义的相同方法引用,因此更难以阅读.

关于并行处理,你的猜测是错误的.第一个具有较小的并行处理能力,因为它依赖于ArrayList.addAll应用于流项(子列表),而不能分成并行子步骤.相反,如果流中遇到的特定s支持它,则Collectors.toList()应用于a flatMap 可以对子列表项进行并行处理List.但只有当你有一个相当小的相当大的子列表流时,这才有意义.

唯一的缺点flatMap是中间流创建,如果你有很多非常小的子列表,它会增加开销.

但在您的示例中,流是空的,因此无关紧要(scnr).