官术网_书友最值得收藏!

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收集器收集到的具有相同鍵的元素。

主站蜘蛛池模板: 江华| 灵台县| 格尔木市| 台山市| 镇坪县| 康乐县| 珲春市| 信阳市| 抚州市| 万载县| 青阳县| 公主岭市| 崇礼县| 都匀市| 宁乡县| 宜都市| 体育| 浠水县| 邢台市| 开平市| 隆林| 千阳县| 泰和县| 江川县| 开封市| 克山县| 治县。| 姚安县| 都江堰市| 临武县| 碌曲县| 黄浦区| 广河县| 台中县| 明星| 大冶市| 紫阳县| 永胜县| 广安市| 余干县| 浦北县|