知识总结-Java8 Stream核心之Collectors收集器详解

之前的文章中也提到了,Stream 的核心在于Collectors,即对处理后的数据进行收集。Collectors 提供了非常多且强大的API,可以将最终的数据收集成List、Set、Map,甚至是更复杂的结构

Collectors 提供了很多API主要分为三大类

  • 数据收集:set、map、list
  • 聚合归约:统计、求和、最值、平均、字符串拼接、规约
  • 前后处理:分区、分组、自定义操作

数据收集

Collectors.toCollection() 将数据转成Collection,只要是Collection 的实现都可以,例如ArrayList、HashSet ,该方法接受一个Collection 的实现对象或者说Collection 工厂的入参。

知识总结-Java8 Stream核心之Collectors收集器详解

Collectors.toList()和Collectors.toSet() 其实和Collectors.toCollection() 差不多,只是指定了容器的类型,默认使用ArrayList 和 HashSet

知识总结-Java8 Stream核心之Collectors收集器详解

Collectors.toMap() 和Collectors.toConcurrentMap(),见名知义,收集成Map和ConcurrentMap,默认使用HashMap和ConcurrentHashMap。这里toConcurrentMap()是可以支持并行收集的,这两种类型都有三个重载方法,不管是Map 还是ConcurrentMap,他们和Collection的区别是Map 是K-V 形式的,所以在收集成Map的时候必须指定收集的K(依据)

知识总结-Java8 Stream核心之Collectors收集器详解

聚合归约

Collectors.joining()拼接,有三个重载方法,底层实现是StringBuilder,通过append方法拼接到一起,并且可以自定义分隔符(这个感觉还是很有用的,很多时候需要把一个list转成一个String,指定分隔符就可以实现了,非常方便)、前缀、后缀。

知识总结-Java8 Stream核心之Collectors收集器详解

Collectors.counting() 统计元素个数,这个和Stream.count() 作用都是一样的,返回的类型一个是包装Long

知识总结-Java8 Stream核心之Collectors收集器详解

Collectors.minBy()、Collectors.maxBy() 和Stream.min()、Stream.max() 作用也是一样的,只不过Collectors.minBy()、Collectors.maxBy()适用于高级场景。

知识总结-Java8 Stream核心之Collectors收集器详解

扩展 Collectors.summingInt()、Collectors.summarizingLong()、Collectors.summarizingDouble() 这三个分别用于int、long、double类型数据一个求总操作;Collectors.averagingInt()、Collectors.averagingDouble()、Collectors.averagingLong() 求平均值;Collectors.reducing() 和Stream.reduce()差不多,也都是规约操作

前后处理

Collectors.groupingBy()和Collectors.groupingByConcurrent(),这两者区别也仅是单线程和多线程的使用场景。为什么要groupingBy归类为前后处理呢?groupingBy 是在数据收集前分组的,再将分好组的数据传递给下游的收集器。

知识总结-Java8 Stream核心之Collectors收集器详解

Collectors.partitioningBy() 字面意思话就叫分区好了,但是partitioningBy最多只能将数据分为两部分,因为partitioningBy分区的依据Predicate,而Predicate只会有true 和false 两种结果,所有partitioningBy最多只能将数据分为两组。

知识总结-Java8 Stream核心之Collectors收集器详解

扩展Collectors.mapping() 可以自定义要收集的字段;Collectors.collectingAndThen()收集后操作,如果你要在收集数据后再做一些操作,那么这个就非常有用了 大家可以自己尝试


分享到:


相關文章: