您好,登錄后才能下訂單哦!
一、什么是Java 8 Stream
使用Java 8 Streams,我們可以按鍵和按值對映射進(jìn)行排序。下面是它的工作原理:
Java Stream函數(shù)式編程?用過都說好,案例圖文詳解送給你
sorted()方法以Comparator作為參數(shù),從而可以按任何類型的值對Map進(jìn)行排序。如果對Comparator不熟悉,可以看本號前幾天的文章,有一篇文章專門介紹了使用Comparator對List進(jìn)行排序。
二、學(xué)習(xí)一下HashMap的merge()函數(shù)
在學(xué)習(xí)Map排序之前,有必要講一下HashMap的merge()函數(shù),該函數(shù)應(yīng)用場景就是當(dāng)Key重復(fù)的時(shí)候,如何處理Map的元素值。這個(gè)函數(shù)有三個(gè)參數(shù):
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鍵值對的時(shí)候,k鍵發(fā)生重復(fù),就執(zhí)行后面的lambda表達(dá)式。表達(dá)式的含義是:返回舊值oldVal加上新值newVal(1+2),現(xiàn)在map里面只有一項(xiàng)元素那就是k:3。
其實(shí)lambda表達(dá)式很簡單:表示匿名函數(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);
看上文中第二段代碼:
上面的程序?qū)⒃诳刂婆_上打印以下內(nèi)容,鍵(國家/地區(qū)名稱)以自然字母順序排序:
China=86
France=33
Germany=49
Pakistan=92
United States=1
請注意使用LinkedHashMap來存儲排序的結(jié)果以保持順序。默認(rèn)情況下,Collectors.toMap()返回HashMap。HashMap不能保證元素的順序。
如果希望按照鍵進(jìn)行逆向排序,加入下圖中紅色部分代碼即可。
四、按Map的值排序
當(dāng)然,您也可以使用Stream API按其值對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對象,并將數(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)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對億速云的支持。
原文鏈接:https://www.cnblogs.com/zimug/p/11781375.html
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。