gpt4 book ai didi

java - 有没有一种首选方法可以将列表流收集到一个平面列表中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:09 24 4
gpt4 key购买 nike

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

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());

第二个选项对我来说看起来更好,但我猜第一个在并行流中更有效。是否有进一步的论据支持或反对这两种方法之一?

最佳答案

主要区别在于 flatMap是一个 intermediate operation.同时collectterminal operation .

所以 flatMap如果您想执行除 collect 之外的其他操作,是处理扁平化流项目的唯一方法立即访问。

进一步collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll)鉴于您有两个相同的方法引用,很难阅读 ArrayList::addAll具有完全不同的语义。

关于并行处理,你的猜测是错误的。第一个具有较少的并行处理能力,因为它依赖于 ArrayList.addAll适用于无法拆分为并行子步骤的流项目(子列表)。相比之下,Collectors.toList()适用于 flatMap如果特定的 List可以对子列表项进行并行处理流中遇到的s支持一下。但这仅在您有相当大的子列表的相当小的流时才有意义。

flatMap 的唯一缺点是中间流创建,在您有很多非常小的子列表的情况下会增加开销。

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

关于java - 有没有一种首选方法可以将列表流收集到一个平面列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25626348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com