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

2022-09-03 06:57:22

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


答案 1

存在看似与 功能重复的收集器,因此它们可以用作收集器组合器(如 ) 的下游收集器。StreamgroupingBy()

作为一个具体示例,假设您要计算“卖方的交易计数”。你可以做:

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

如果没有像 或 这样的收集器,这些类型的查询将更加困难。counting()mapping()


答案 2

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

  • 中间操作 - 、 、 。它们生成 Stream 的实例并且总是懒惰的,例如,不会发生 Stream 元素的实际遍历。这些操作用于创建转换链Stream.mapStream.flatMapStream.filter
  • 终端操作 - 、 等它们执行实际工作,例如,在流上执行转换链操作,产生终端值。可以是列表,元素计数,第一个元素等。Stream.collectStream.findFirstStream.reduce

请查看流包摘要 javadoc 以获取更多信息。


推荐