最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何利用Java8 Stream API對Map按鍵或值排序

 更新時間:2019年11月02日 15:16:55   作者:字母哥博客  
這篇文章主要給大家介紹了關于如何利用Java8 Stream API對Map按鍵或值排序的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Java8具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

一、什么是Java 8 Stream

使用Java 8 Streams,我們可以按鍵和按值對映射進行排序。下面是它的工作原理:

Java Stream函數(shù)式編程?用過都說好,案例圖文詳解送給你

  1. 將Map或List等集合類對象轉(zhuǎn)換為Stream對象
  2. 使用Streams的sorted()方法對其進行排序
  3. 最終將其返回為LinkedHashMap(可以保留排序順序)

sorted()方法以Comparator作為參數(shù),從而可以按任何類型的值對Map進行排序。如果對Comparator不熟悉,可以看本號前幾天的文章,有一篇文章專門介紹了使用Comparator對List進行排序。

二、學習一下HashMap的merge()函數(shù)

在學習Map排序之前,有必要講一下HashMap的merge()函數(shù),該函數(shù)應用場景就是當Key重復的時候,如何處理Map的元素值。這個函數(shù)有三個參數(shù):

  • 參數(shù)一:向map里面put的鍵
  • 參數(shù)二:向map里面put的值
  • 參數(shù)三:如果鍵發(fā)生重復,如何處理值??梢允且粋€函數(shù),也可以寫成lambda表達式。
    String k = "key";
    HashMap<String, Integer> map = new HashMap<String, Integer>() {{
      put(k, 1);
    }};
    map.merge(k, 2, (oldVal, newVal) -> oldVal + newVal);

看上面一段代碼,我們首先創(chuàng)建了一個HashMap,并往里面放入了一個鍵值為k:1的元素。當我們調(diào)用merge函數(shù),往map里面放入k:2鍵值對的時候,k鍵發(fā)生重復,就執(zhí)行后面的lambda表達式。表達式的含義是:返回舊值oldVal加上新值newVal(1+2),現(xiàn)在map里面只有一項元素那就是k:3。

其實lambda表達式很簡單:表示匿名函數(shù),箭頭左側(cè)是參數(shù),箭頭右側(cè)是函數(shù)體。函數(shù)的參數(shù)類型和返回值,由代碼上下文來確定。

三、按Map的鍵排序

下面一個例子使用Java 8 Stream按Map的鍵進行排序:

// 創(chuàng)建一個Map,并填入數(shù)據(jù)
Map<String, Integer> codes = new HashMap<>();
codes.put("United States", 1);
codes.put("Germany", 49);
codes.put("France", 33);
codes.put("China", 86);
codes.put("Pakistan", 92);

// 按照Map的鍵進行排序
Map<String, Integer> sortedMap = codes.entrySet().stream()  
    .sorted(Map.Entry.comparingByKey())
    .collect(
        Collectors.toMap(
          Map.Entry::getKey, 
          Map.Entry::getValue,
          (oldVal, newVal) -> oldVal,
          LinkedHashMap::new
        )
    );

// 將排序后的Map打印
sortedMap.entrySet().forEach(System.out::println);

看上文中第二段代碼:

  • 首先使用entrySet().stream() 將Map類型轉(zhuǎn)換為Stream流類型。
  • 然后使用sorted方法排序,排序的依據(jù)是Map.Entry.comparingByKey(),也就是按照Map的鍵排序
  • 最后用collect方法將Stream流轉(zhuǎn)成LinkedHashMap。 其他參數(shù)都好說,重點看第三個參數(shù),就是一個merge規(guī)則的lambda表達式,與merge方法的第三個參數(shù)的用法一致。由于本例中沒有重復的key,所以新值舊值隨便返回一個即可。

上面的程序?qū)⒃诳刂婆_上打印以下內(nèi)容,鍵(國家/地區(qū)名稱)以自然字母順序排序:

China=86
France=33
Germany=49
Pakistan=92
United States=1

請注意使用LinkedHashMap來存儲排序的結(jié)果以保持順序。默認情況下,Collectors.toMap()返回HashMap。HashMap不能保證元素的順序。

如果希望按照鍵進行逆向排序,加入下圖中紅色部分代碼即可。


四、按Map的值排序

當然,您也可以使用Stream API按其值對Map進行排序:

Map<String, Integer> sortedMap2 = codes.entrySet().stream()
    .sorted(Map.Entry.comparingByValue())
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        (oldVal, newVal) -> oldVal,
        LinkedHashMap::new));

sortedMap2.entrySet().forEach(System.out::println);

這是顯示Map按值排序的輸出:

United States=1
France=33
Germany=49
China=86
Pakistan=92

五、使用TreeMap按鍵排序

大家可能都知道TreeMap內(nèi)的元素是有順序的,所以利用TreeMap排序也是可取的一種方法。您需要做的就是創(chuàng)建一個TreeMap對象,并將數(shù)據(jù)從HashMapput到TreeMap中,非常簡單:

// 將 `HashMap` 轉(zhuǎn)為 `TreeMap`
Map<String, Integer> sorted = new TreeMap<>(codes);

這是輸出:

China=86
France=33
Germany=49
Pakistan=92
United States=1

如上所示,鍵(國家/地區(qū)名稱)以自然字母順序排序。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

原文鏈接:https://www.cnblogs.com/zimug/p/11781375.html

相關文章

  • SpringBoot log打印及輸出方式

    SpringBoot log打印及輸出方式

    這篇文章主要介紹了SpringBoot log打印及輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot與docker的結(jié)合的示例

    SpringBoot與docker的結(jié)合的示例

    本篇文章主要介紹了SpringBoot與docker的結(jié)合的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • MyBatis將查詢出的兩列數(shù)據(jù)裝配成鍵值對的操作方法

    MyBatis將查詢出的兩列數(shù)據(jù)裝配成鍵值對的操作方法

    這篇文章主要介紹了MyBatis將查詢出的兩列數(shù)據(jù)裝配成鍵值對的操作代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Java完全二叉樹的創(chuàng)建與四種遍歷方法分析

    Java完全二叉樹的創(chuàng)建與四種遍歷方法分析

    這篇文章主要介紹了Java完全二叉樹的創(chuàng)建與四種遍歷方法,結(jié)合實例形式分析了完全二叉樹的概念、定義及遍歷操作相關實現(xiàn)技巧,并對比分析了滿二叉樹與完全二叉樹的區(qū)別,需要的朋友可以參考下
    2017-11-11
  • SpringBoot整合Java DL4J實現(xiàn)情感分析系統(tǒng)

    SpringBoot整合Java DL4J實現(xiàn)情感分析系統(tǒng)

    在當今數(shù)字化時代,企業(yè)越來越重視用戶的反饋,以不斷改進產(chǎn)品和服務,自然語言處理技術為分析用戶評價提供了強大的工具,本文將介紹如何使用 Spring Boot 整合 Java Deeplearning4j 構(gòu)建一個情感分析系統(tǒng),需要的朋友可以參考下
    2024-10-10
  • Mybatis枚舉類型轉(zhuǎn)換源碼分析

    Mybatis枚舉類型轉(zhuǎn)換源碼分析

    在Mybatis的TypeHandlerRegistry中,添加了常用的類轉(zhuǎn)換器,其中默認的枚舉類型轉(zhuǎn)換器是EnumTypeHandler,這篇文章主要介紹了Mybatis枚舉類型轉(zhuǎn)換源碼分析,需要的朋友可以參考下
    2024-05-05
  • SpringBoot中Redis的緩存更新策略詳解

    SpringBoot中Redis的緩存更新策略詳解

    這篇文章主要介紹了SpringBoot中Redis的緩存更新策略,緩存一般是為了應對高并發(fā)場景、緩解數(shù)據(jù)庫讀寫壓力,而將數(shù)據(jù)存儲在讀寫更快的某種存儲介質(zhì)中(如內(nèi)存),以加快讀取數(shù)據(jù)的速度,需要的朋友可以參考下
    2023-08-08
  • SpringBoot中整合MyBatis-Plus的方法示例

    SpringBoot中整合MyBatis-Plus的方法示例

    這篇文章主要介紹了SpringBoot中整合MyBatis-Plus的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java實現(xiàn)登錄與注冊頁面

    Java實現(xiàn)登錄與注冊頁面

    這篇文章主要為大家詳細介紹了Java實現(xiàn)登錄與注冊頁面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • QQ好友列表樹形列表java代碼實現(xiàn)代碼

    QQ好友列表樹形列表java代碼實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了QQ好友列表樹形列表簡單實現(xiàn)方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評論

崇义县| 呼伦贝尔市| 沙田区| 兴仁县| 延安市| 秭归县| 通州市| 贵南县| 即墨市| 广西| 辰溪县| 淳安县| 青铜峡市| 吴堡县| 新余市| 甘肃省| 德化县| 岑巩县| 枣庄市| 井研县| 奈曼旗| 邵武市| 宿州市| 陆川县| 阿图什市| 开化县| 永丰县| 山西省| 景德镇市| 凤城市| 南陵县| 浦城县| 巴林右旗| 新化县| 拜泉县| 砀山县| 寿阳县| 崇义县| 隆林| 大方县| 佛冈县|