我注意到Stream中显示的许多功能显然在Collectors中重复,例如Stream.map(Foo::bar)
与Collectors.mapping(Foo::bar, ...)
或Stream.count()
对{ {1}}。这些方法之间的区别是什么?有性能差异吗?它们是否以某种方式实现不同,影响它们的并行化程度?
答案 0 :(得分:11)
似乎在Stream
中复制功能的收集器存在,因此它们可以用作下游收集器,用于groupingBy()
等收集器组合器。
作为一个具体的例子,假设您想要计算“卖家的交易数量”。你可以这样做:
Map<Seller, Long> salesBySeller =
txns.stream()
.collect(groupingBy(Txn::getSeller, counting()));
如果没有像counting()
或mapping()
这样的收藏家,这类查询将会更加困难。
答案 1 :(得分:2)
有很大的不同。流操作可以分为两组:
Stream.map
,Stream.flatMap
,Stream.filter
。那些产生Stream的实例并且总是 lazy ,例如没有实际遍历Stream元素。这些操作用于创建转换链。Stream.collect
,Stream.findFirst
,Stream.reduce
等。这些是完成实际工作的,例如在流上执行转换链操作,生成终端值。这可能是List,元素数,第一元素等。请查看Stream package summary javadoc以获取更多信息。