知識總結-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()收集後操作,如果你要在收集數據後再做一些操作,那麼這個就非常有用了 大家可以自己嘗試


分享到:


相關文章: