一、排序实例:
需求:
按照销量排序显示产品 ,pill 为药品对象 rank 属性为其销量
code:
daMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.comparing(Pill::getRank)))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldVal, newVal) -> oldVal,
LinkedHashMap::new));分析:
- 首先使用entrySet().stream() 将Map类型转换为Stream流类型。
- 然后使用sorted方法排序,排序的依据是Map.Entry.comparingByValue(),也就是按照Map的值排序, 而其值为一个object ,取object的rank属性排序
- 最后用collect方法将Stream流转成LinkedHashMap。 第一个参数是 原来的键,第二个参数为原来的值 ,重点看第三个参数,就是一个merge规则的lambda表达式,当出现重复的key,返回旧值一个即可。
- 请注意使用
LinkedHashMap来存储排序的结果以保持顺序。默认情况Collectors.toMap()返回HashMap。HashMap不能保证元素的顺序。
二、介绍下 java streams
- 将Map或List等集合类对象转换为Stream对象
- 使用Streams的
sorted()方法对其进行排序 - 最终将其返回为
LinkedHashMap(可以保留排序顺序)
sorted()方法以Comparator作为参数,从而可以按任何类型的值对Map进行排序。如果对Comparator不熟悉,可以看这个文章:juejin.cn/post/684490…