Stream.map(...)和Collectors.mapping(...)之间的区别是什么?

时间:2016-04-20 20:03:19

标签: java java-8 java-stream

我注意到Stream中显示的许多功能显然在Collectors中重复,例如Stream.map(Foo::bar)Collectors.mapping(Foo::bar, ...)Stream.count()对{ {1}}。这些方法之间的区别是什么?有性能差异吗?它们是否以某种方式实现不同,影响它们的并行化程度?

2 个答案:

答案 0 :(得分:11)

似乎在Stream中复制功能的收集器存在,因此它们可以用作下游收集器,用于groupingBy()等收集器组合器。

作为一个具体的例子,假设您想要计算“卖家的交易数量”。你可以这样做:

Map<Seller, Long> salesBySeller = 
    txns.stream()
        .collect(groupingBy(Txn::getSeller, counting()));

如果没有像counting()mapping()这样的收藏家,这类查询将会更加困难。

答案 1 :(得分:2)

有很大的不同。流操作可以分为两组:

  • 中级操作 - Stream.mapStream.flatMapStream.filter。那些产生Stream的实例并且总是 lazy ,例如没有实际遍历Stream元素。这些操作用于创建转换链
  • 终端操作 - Stream.collectStream.findFirstStream.reduce等。这些是完成实际工作的,例如在流上执行转换链操作,生成终端值。这可能是List,元素数,第一元素等。

请查看Stream package summary javadoc以获取更多信息。