91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-03 05:54:01 來源:腳本之家 閱讀:218 作者:字母哥博客 欄目:編程語言

一、什么是Java 8 Stream

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

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

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

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

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

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

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

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

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

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

三、按Map的鍵排序

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

// 創建一個Map,并填入數據
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類型轉換為Stream流類型。
  • 然后使用sorted方法排序,排序的依據是Map.Entry.comparingByKey(),也就是按照Map的鍵排序
  • 最后用collect方法將Stream流轉成LinkedHashMap。 其他參數都好說,重點看第三個參數,就是一個merge規則的lambda表達式,與merge方法的第三個參數的用法一致。由于本例中沒有重復的key,所以新值舊值隨便返回一個即可。

上面的程序將在控制臺上打印以下內容,鍵(國家/地區名稱)以自然字母順序排序:

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

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

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

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

四、按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內的元素是有順序的,所以利用TreeMap排序也是可取的一種方法。您需要做的就是創建一個TreeMap對象,并將數據從HashMapput到TreeMap中,非常簡單:

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

這是輸出:

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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽中县| 句容市| 新闻| 滦南县| 乐东| 义马市| 牡丹江市| 营山县| 睢宁县| 靖边县| 平潭县| 凤山县| 新和县| 沈阳市| 七台河市| 苍山县| 巫山县| 卓尼县| 调兵山市| 乌海市| 阳城县| 兰坪| 渭源县| 沾益县| 云阳县| 南京市| 酒泉市| 汝城县| 开封市| 邳州市| 隆昌县| 如皋市| 琼海市| 稷山县| 阳山县| 宁德市| 中江县| 静海县| 会昌县| 团风县| 道真|