我在想,是否有一种首选的方法可以从列表流中获取包含所有列表元素的集合。 我能想到两种方法来实现这个目标:
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());
在我看来,第二种选择更漂亮,但我猜第一种在并行流方面更有效率。 对于这两种方法,还有进一步的支持或反对的论点吗?
The second option looks much nicer to me, but I guess the first one is more efficient in parallel streams. Are there further arguments for or against one of the two methods?
Stream
处理方面是相同的,即 外部 流。但在第二个版本中,扁平化流由 子列表 的元素组成,这允许在子列表的中间分割操作(如果可行)。这在第一个版本中是不可能的。正如所说,只有在流包含一些相当大的子列表(而且它们的大小不同)时,这才是相关的。由于在flatMap
和collect
之间没有中间操作,因此只有collect
本身受到影响,因此差异可能非常小。 - HolgerflatMap
和collect
之间需要进行操作,那么肯定不应该使用第一个版本。我没有考虑到这些。谢谢你的回复。 - muued