使用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
复制代码
如上所示,键(国家/地区名称)以天然字母顺序排序。