欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何利用Java8 Stream API對(duì)Map按鍵或值排序

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

一、什么是Java 8 Stream

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

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

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

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

二、學(xué)習(xí)一下HashMap的merge()函數(shù)

在學(xué)習(xí)Map排序之前,有必要講一下HashMap的merge()函數(shù),該函數(shù)應(yīng)用場(chǎng)景就是當(dāng)Key重復(fù)的時(shí)候,如何處理Map的元素值。這個(gè)函數(shù)有三個(gè)參數(shù):

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

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

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

三、按Map的鍵排序

下面一個(gè)例子使用Java 8 Stream按Map的鍵進(jìn)行排序:

// 創(chuàng)建一個(gè)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的鍵進(jìn)行排序
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ù)都好說,重點(diǎn)看第三個(gè)參數(shù),就是一個(gè)merge規(guī)則的lambda表達(dá)式,與merge方法的第三個(gè)參數(shù)的用法一致。由于本例中沒有重復(fù)的key,所以新值舊值隨便返回一個(gè)即可。

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

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

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

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


四、按Map的值排序

當(dāng)然,您也可以使用Stream API按其值對(duì)Map進(jìn)行排序:

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)建一個(gè)TreeMap對(duì)象,并將數(shù)據(jù)從HashMapput到TreeMap中,非常簡(jiǎn)單:

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

這是輸出:

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

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

總結(jié)

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

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

相關(guān)文章

  • Spring詳細(xì)講解FactoryBean接口的使用

    Spring詳細(xì)講解FactoryBean接口的使用

    這篇文章主要為大家介紹了Spring容器FactoryBean工廠實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • IDEA啟動(dòng)Tomcat時(shí)控制臺(tái)出現(xiàn)亂碼問題及解決

    IDEA啟動(dòng)Tomcat時(shí)控制臺(tái)出現(xiàn)亂碼問題及解決

    這篇文章主要介紹了IDEA啟動(dòng)Tomcat時(shí)控制臺(tái)出現(xiàn)亂碼問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Struts2實(shí)現(xiàn)上傳單個(gè)文件功能

    Struts2實(shí)現(xiàn)上傳單個(gè)文件功能

    這篇文章主要為大家詳細(xì)介紹了Struts2實(shí)現(xiàn)上傳單個(gè)文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • MyEclipse安裝JS代碼提示的教程(Spket插件)

    MyEclipse安裝JS代碼提示的教程(Spket插件)

    本篇文章主要介紹了MyEclipse安裝JS代碼提示的教程(Spket插件),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • J2SE基礎(chǔ)之在Eclipse中運(yùn)行hello world

    J2SE基礎(chǔ)之在Eclipse中運(yùn)行hello world

    本文的內(nèi)容非常的簡(jiǎn)單,跟隨世界潮流,第一個(gè)Java程序輸出“Hell World!”。希望大家能夠喜歡
    2016-05-05
  • Java中notify是順序喚醒還是隨機(jī)喚醒的

    Java中notify是順序喚醒還是隨機(jī)喚醒的

    這篇文章主要介紹了Java中notify是順序喚醒還是隨機(jī)喚醒的,有很多人會(huì)認(rèn)為?notify?是隨機(jī)喚醒的,但它真的是隨機(jī)喚醒的嗎?帶著疑問一起進(jìn)入文章了解具體的內(nèi)容吧
    2022-05-05
  • 在SpringBoot中更改默認(rèn)端口的方法總結(jié)

    在SpringBoot中更改默認(rèn)端口的方法總結(jié)

    在本文中,小編將帶大家學(xué)習(xí)如何在 Spring Boot 中更改默認(rèn)端口,默認(rèn)情況下,嵌入式 Web 服務(wù)器使用 8080端口來啟動(dòng) Spring 引導(dǎo)應(yīng)用程序,有幾種方法可以更改該端口,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • SpringMVC基于注解方式實(shí)現(xiàn)上傳下載

    SpringMVC基于注解方式實(shí)現(xiàn)上傳下載

    本文主要介紹了SpringMVC基于注解方式實(shí)現(xiàn)上傳下載,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java中方法重寫與重載的區(qū)別

    Java中方法重寫與重載的區(qū)別

    大家好,本篇文章主要講的是Java中方法重寫與重載的區(qū)別,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • springboot如何去除debug日志

    springboot如何去除debug日志

    這篇文章主要介紹了springboot如何去除debug日志的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論