`

第八章 - Map与Collect模型

 
阅读更多

使用流来收集数据

上一章中我们谈到流的重要特性:

  • 流中的元素不是保存在内存中
  • 流不能被重复使用
  • 流是懒处理数据
  • 流操作不能改变流数据源
  • 流允许你把操作串联起来,因此一个操作的输出可以作为下一个操作的输入

Stream的 collect() 方法

collect() 方法允许你对流中的元素进行转换和分组来生成一个新的数据结构。有两个不同版本的 collect() 方法。

第一个版本接收以下三个函数作为参数:

  • Supplier:该方法创建一个中间数据类型对象。如果你使用串行流,那么该方法被调用一次。如果你使用并行流那么该方法会被调用多次并且每次调用必须生成一个新的对象
  • Accumulator:该方法在处理每一个流中元素时被调用,并保存在中间数据结构
  • Combiner:该方法在要把两个中间数据结构整合成一个时调用。该方法只会在使用并行流时被调用

Java 通过 Collectors 工厂类提供了一些预定义的收集器。你可以调用以下静态方法来使用这些收集器:

  • averagingDouble(),averagingInt(),和 averagingLong():返回一个collector来计算平均值
  • groupingBy():返回一个收集器,该收集器允许你使用流中对象的某个属性来对流中数据进行分组。最终得到的对象是一个map,它的key是选择的属性的值,value是一个对象的队列。
  • groupingByConcurrent():这和groupingBy()类似但有两个重要区别。一个是在并行处理时它的性能比groupingBy()高,但在串行处理时性能慢。第二个不同点是 groupingByConcurrent() 方法不是一个排序的收集器。lists中的对象不能保证和原始数据流中的对象顺序一致。但是 groupingBy() 收集器却能保证顺序。
  • joining():返回一个收集器来把流中的元素拼接成一个字符串。
  • partitioningBy():返回一个收集器用来把流中数据基于一个 predicate 结果来分割
  • summarizingDouble(),summarizingInt(), 和 summarizingLong():返回的收集器用来计算流中元素的汇总信息。例如调用 summarizingInt() 方法得到的最终值是 IntSummaryStatistics 对象,你可以调用该对象的 getMax(),getMin(), getCount() 等方法得到流中数据的分析信息。
  • toMap():该收集器允许你把流中的数据根据传递的两个映射方法转换成一个map,第一个映射方法参数决定map 的key,第二个映射方法参数决定map的value
  • toConcurrentMap():这个和toMap()类似,但是是用并行方式处理的。性能在使用并行方法时比较高效。但是得到的map里的对象是无序的。
  • toList():该收集器把流中的数据收集保存在一个list中
  • toCollection():该收集器允许你把流中的数据保存到一个新的Collection里并返回。该方法接收一个 Supplier 接口的实现用来创建新的collection对象
  • maxBy()和minBy():该收集器返回使用传入的 comparator 参数来决定的数据流中的最大值和最小值
  • toSet():该收集器把流中的数据收集保存在一个set中

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics