使用Java 8 Streams,咱們能夠按鍵和按值對映射進行排序。下面是它的工做原理:java
sorted()
方法對其進行排序LinkedHashMap
(能夠保留排序順序)sorted()
方法以Comparator
做爲參數,從而能夠按任何類型的值對Map進行排序。若是對Comparator不熟悉,能夠看本號前幾天的文章,有一篇文章專門介紹了使用Comparator對List進行排序。spring
在學習Map排序以前,有必要講一下HashMap的merge()函數,該函數應用場景就是當Key重複的時候,如何處理Map的元素值。這個函數有三個參數:編程
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。springboot
其實lambda表達式很簡單:表示匿名函數,箭頭左側是參數,箭頭右側是函數體。函數的參數類型和返回值,由代碼上下文來肯定。bash
下面一個例子使用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);
複製代碼
看上文中第二段代碼:函數
上面的程序將在控制檯上打印如下內容,鍵(國家/地區名稱)以天然字母順序排序:學習
China=86
France=33
Germany=49
Pakistan=92
United States=1
複製代碼
請注意使用
LinkedHashMap
來存儲排序的結果以保持順序。默認狀況下,Collectors.toMap()
返回HashMap
。HashMap
不能保證元素的順序。spa
若是但願按照鍵進行逆向排序,加入下圖中紅色部分代碼便可。 code
固然,您也可使用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
對象,並將數據從HashMap
put到TreeMap
中,很是簡單:
// 將 `HashMap` 轉爲 `TreeMap`
Map<String, Integer> sorted = new TreeMap<>(codes);
複製代碼
這是輸出:
China=86
France=33
Germany=49
Pakistan=92
United States=1
複製代碼
如上所示,鍵(國家/地區名稱)以天然字母順序排序。