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

nas*_*fin 12 java java-8 java-stream

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

Bri*_*etz 12

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

举一个具体的例子,假设您想要计算"卖家的交易数量".你可以这样做:

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

没有收藏家喜欢counting()或者mapping(),这些类型的查询会更加困难.

  • 值得注意的是,Java 9还将"过滤"和"flatMapping"添加到"收集器"中,这样​​就有了收敛性...... (4认同)