- Java核心技術·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 920字
- 2020-10-30 18:10:36
1.11 下游收集器
groupingBy方法會產生一個映射表,它的每個值都是一個列表。如果想要以某種方式來處理這些列表,就需要提供一個“下游收集器”。例如,如果想要獲得集而不是列表,那么可以使用上一節中看到的Collector.toSet收集器:

注意:在本節的這個示例以及后續示例中,我們認為靜態導入java.util.stream.Collectors.*會使表達式更容易閱讀。
Java提供了多種可以將群組元素約簡為數字的收集器:
·counting會產生收集到的元素的個數。例如:

可以對每個國家有多少個Locale進行計數。
·summing(Int|Long|Double)會接受一個函數作為引元,將該函數應用到下游元素中,并產生它們的和。例如:

可以計算城市流中每個州的人口總和。
·maxBy和minBy會接受一個比較器,并產生下游元素中的最大值和最小值。例如:

可以產生每個州中最大的城市。
mapping方法會產生將函數應用到下游結果上的收集器,并將函數值傳遞給另一個收集器。例如:

這里,我們按照州將城市群組在一起。在每個州內部,我們生成了各個城市的名字,并按照最大長度約簡。
mapping方法還針對上一節中的問題,即把某國所有的語言收集到一個集中,產生了一種更佳的解決方案。

在上一節中,我們使用的是toMap而不是groupingBy。而在上述這種方式中,我們無須操心如何將各個集組合起來。
如果群組和映射函數的返回值為int、long或double,那么可以將元素收集到匯總統計對象中,就像1.8節中所討論的一樣。例如,

然后,可以從每個組的匯總統計對象中獲取這些函數值的總和、個數、平均值、最小值和最大值。
注意:還有3個版本的reducing方法,它們都應用了通用的約簡操作,正如1.12節中所描述的一樣。
將收集器組合起來是一種很強大的方式,但是它也可能會導致產生非常復雜的表達式。它們的最佳用法是與groupingBy和partitioningBy一起處理“下游的”映射表中的值。否則,應該直接在流上應用諸如map、reduce、count、max或min這樣的方法。
程序清單1-6中的示例程序演示了下游收集器。
程序清單1-6 collecting/DownstreamCollectors.java



java.util.stream.Collectors 8
·static<T>Collector<T,?,Long>counting()
產生一個可以對收集到的元素進行計數的收集器。
·static<T>Collector<T,?,Integer>summingInt(ToIntFunction<?super T>mapper)
·static<T>Collector<T,?,Long>summingLong(ToLongFunction<?super T>mapper)
·static<T>Collector<T,?,Double>summingDouble(ToDoubleFunction<?super T>mapper)
產生一個收集器,對將mapper應用到收集到的元素上之后產生的值計算總和。
·static<T>Collector<T,?,Optional<T>>maxBy(Comparator<?super T>comparator)
·static<T>Collector<T,?,Optional<T>>minBy(Comparator<?super T>comparator)
產生一個收集器,使用comparator指定的排序方法,計算收集到的元素中的最大值和最小值。
·static<T,U,A,R>Collector<T,?,R>mapping(Function<?super T,?extends U>mapper,Collector<?super U,A,R>downstream)
產生一個收集器,它會產生一個映射表,其鍵是將mapper應用到收集到的數據上而產生的,其值是使用downstream收集器收集到的具有相同鍵的元素。
- Implementing Modern DevOps
- Boost程序庫完全開發指南:深入C++”準”標準庫(第5版)
- ReSharper Essentials
- Go語言高效編程:原理、可觀測性與優化
- Visual Basic編程:從基礎到實踐(第2版)
- Machine Learning with R Cookbook(Second Edition)
- Building Mobile Applications Using Kendo UI Mobile and ASP.NET Web API
- 21天學通C++(第6版)
- Python編程與幾何圖形
- JavaScript:Moving to ES2015
- HTML5入門經典
- Unreal Engine 4 Shaders and Effects Cookbook
- Android項目實戰:手機安全衛士開發案例解析
- Visual C++從入門到精通(第2版)
- Applied Deep Learning with Python