激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java 流的高級使用之收集數據解析

Java 流的高級使用之收集數據解析

2021-12-03 13:26FXBStudy Java教程

這篇文章主要介紹了Java 流的高級使用之收集數據解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

 

一、前言

 

1.1 收集器

收集器的接口是java.util.stream.Collector,我們只需要調用流的collect方法并傳遞給一個Collector接口的一個實現(也就是給Stream中元素做匯總的方法),就可以了。例如java.util.stream.Collectors類的toList()方法,該方法就會返回一個按順序給每個元素生成一個列表的Collector接口的實現。

收集器非常有用,因為它可以簡介而靈活地定義collect用來生成結果集合的標準。更具體地說,對流調用collect方法將對流中的元素觸發一個規約操作(由Collector來參數化)。

 

1.2 預定義收集器

JDK為我們提供了java.util.stream.Collectors類,其為我們提供了很多靜態工廠方法,可以方便地創建常見的收集器實例,而我們只要拿來用就可以了。最直接和最常用的收集器是toList靜態方法,它會把流中所有的元素收集到一個List中。

 

Collectors類為我們提供的收集器,主要包含三大功能:

  • 將流元素規約和匯總為一個值
  • 元素分組
  • 元素分區

注意:因為其為我們提供的都是靜態方法,我們可以通過靜態導入的方式簡化代碼的書寫。

 

二、深入

 

2.1 規約和匯總

 

統計元素數量

Collectors為我們提供了counting方法,為我們提供了統計元素數量的收集器。實例:

long howManyDishes = menu.stream().collect(Collectors.counting());

上面的示例是利用預定義收集器實現的,其實Stream接口定義了count方法,因此我們也可以直接調用Stream提供的預定義方法來實現,如下:

long howManyDishes = menu.stream().count();

功能一樣用哪個才好呢?其實如果你的需求只是統計流中元素的數量的時候,二者皆可。最大的區別在于count()是一個終端操作,而counting返回的是一個收集器,其可以和其它收集器聯合使用。

 

查找流中的最大值和最小值

Collectors為我們提供了maxBy方法和mixBy方法,為我們提供了計算流中的最大或最小值的收集器。實例:

Comparator<Dish> dishCaloriesComparator = Comparator.comparingInt(Dish::getCalories);
Optional<Dish> mostCalorieDish = menu.stream().collect(maxBy(dishCaloriesComparator));

 

匯總

求和

Collectors類專門為匯總提供了一個工廠方法: Collectors.summingInt。它可接受一個把對象映射為求和所需int的函數,并返回一個收集器;該收集器在傳遞給普通的collect方法后即執行我們需要的匯總操作。

類Collectors.summingLong和Collectors.summingDouble方法的作用完全一樣,可以用于求和字段為long或double的情況。

求出菜單列表的總熱量的示例:

int totalCalories = menu.stream().collect(summingInt(Dish::getCalories));

上面代碼的收集過程下圖所示。在遍歷流時,會把每一道菜都映射為其熱量,然后把這個數字累加到一個累加器(這里的初始值0)。

Java 流的高級使用之收集數據解析

平均值

Collectors類的averagingInt、averagingLong 和 averagingDouble 可以為我們生成計算數值的平均數的收集器:

double avgCalories = menu.stream().collect(averagingInt(Dish::getCalories));

綜合匯總

Collectors類為我們提供了summarizingInt工廠方法,其返回的收集器可以一次性統計出總數、總和、平均值、最大值和最小值。

例如,通過一次summarizing操作你可以就數出菜單中元素的個數,并得到菜肴熱量總和、平均值、最大值和最小值:

IntSummaryStatistics menuStatistics =
        menu.stream().collect(summarizingInt(Dish::getCalories));

這個收集器會把所有這些信息收集到一個叫作IntSummaryStatistics的類里,它提供了方便的取值方法來訪問結果。打印menuStatisticobject會得到以下輸出:

IntSummaryStatistics{count=9, sum=4300, min=120, average=477.777778, max=800}

同樣,相應的summarizingLong和summarizingDouble工廠方法有相關的LongSummaryStatistics 和DoubleSummaryStatistics 類 型 , 適用于收集的屬性是原始類型 long 或 double 的情況。

 

連接字符串

Collectors類為我們提供的joining工廠方法返回的收集器會把對流中每一個對象應用toString方法得到的所有字符串連接成一個字符串。

這意味著你把菜單中所有菜肴的名稱連接起來,如下所示:

String shortMenu = menu.stream().map(Dish::getName).collect(joining());

注意: joining在內部使用了StringBuilder來把生成的字符串逐個追加起來。

此外joining工廠方法有一個重載版本可以接受元素之間的分界符,這樣你就可以得到一個逗號分隔的菜肴名稱列表:

String shortMenu = menu.stream().map(Dish::getName).collect(joining(", "));

廣義的規約匯總

前面所提及的收集器都是一個可以用reducing工廠方法定義的規約過程的特殊情況而已。Collectors.reducing工廠方法是所有這些特殊情況的一般化。

public static <T,U> Collector<T,?,U> reducing(U identity,
                    Function<? super T,? extends U> mapper, BinaryOperator<U> op)

參數解析:

  • 第一個參數時規約操作的起始值,也是流中沒有元素時的返回值。
  • 第二個參數是Function,將做一定的轉換操作。
  • 第三個參數BinaryOperator,將兩個項目累積成一個同類型的值。

我們將上面的示例轉換一下:

Comparator<Dish> dishCaloriesComparator = Comparator.comparingInt(Dish::getCalories);
Optional<Dish> mostCalorieDish = menu.stream().collect(maxBy(dishCaloriesComparator));
// 轉換
Optional<Dish> mostCalorieDish = 
        menu.stream().collect(reducing(
                (d1,d2) -> d1.getCalories() > d1.getCalories() ? d1 : d2));

上面轉換示例中,我們使用的是一個單參數的reducing工廠方法創建的收集器,其可以看做是三個參數方法的特殊情況,它把流中的第一個項目作為起點,把恒等函數(即一個函數僅僅是返回其輸入參數)作為一個轉換函數。

 

2.2 分組

一個常見的數據庫操作是根據一個或多個屬性對集合中的項目進行分組。

假設你要把菜單中的菜按照類型進行分類,有肉的放一組,有魚的放一組,其他的都放另一組。用Collectors.groupingBy工廠方法返回的收集器就可以輕松地完成這項任務,如下所示:

Map<Dish.Type, List<Dish>> dishesByType =
        menu.stream().collect(groupingBy(Dish::getType));

這里,你給groupingBy方法傳遞了一個Function(以方法引用的形式),它提取了流中每一道Dish的Dish.Type。我們把這個Function叫作分類函數,因為它用來把流中的元素分成不同的組。如下圖所示,分組操作的結果是一個Map,把分組函數返回的值作為映射的鍵,把流中所有具有這個分類值的項目的列表作為對應的映射值。在菜單分類的例子中,鍵就是菜的類型,值就是包含所有對應類型的菜肴的列表。

Java 流的高級使用之收集數據解析

特殊應用示例:

public enum CaloricLevel{DIET,NORMAL,FAT}
Map<CaloricLevel, List<Dish>> dishesByCaloricLevel = menu.stream().collect(groupingBy(dish -> {
    if (dish.getCalories() <= 400)
        return CaloricLevel.DIET;
    else if (dish.getCalories() <= 700)
        return CaloricLevel.NORMAL;
    else
        return CaloricLevel.FAT;
}));

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://fanxiaobin.blog.csdn.net/article/details/82147256

延伸 · 閱讀

精彩推薦
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
主站蜘蛛池模板: www.91sese| 成人h精品动漫一区二区三区 | av在线免费观看网址 | 国产日韩在线观看视频 | 国产一区二区精品在线观看 | 三人弄娇妻高潮3p视频 | xxxx18韩国护士hd老师 | 亚洲国产高清一区 | 黄色片视频在线观看 | 国产午夜精品一区二区三区四区 | 精品亚洲成a人在线观看 | 国产精品99精品 | 精品国产一级毛片 | 成人在线观看免费高清 | 精品国产一区二区三区久久久蜜月 | 免费a网 | 特黄一级小说 | 九九热国产视频 | 国产精品视频亚洲 | 日本网站一区二区三区 | 久久国产精品久久精品国产演员表 | 亚洲第一成人在线视频 | 91精品国产日韩91久久久久久360 | 一级大黄毛片免费观看 | 久久密 | 视频一区二区视频 | 成人毛片100部免费观看 | 欧美成人精品h版在线观看 在线2区 | 爱操影院| 久久国产经典 | av日韩在线免费观看 | 欧美成人免费 | 成人免费福利视频 | 亚洲精品aa| 久久在草| 毛片免费视频网站 | 日本成人午夜视频 | 日本黄色a视频 | 欧美一级理论 | 一级毛片在线观看免费 | 女女久久 |