如何将Map按值排序后转为Map.Entry列表?
解决Map按值排序后获取Map.Entry列表的问题
嘿,这个场景我太熟悉了!确实Map.Entry是抽象类没法直接实例化,但咱们有好几种办法轻松绕开这个问题,得到想要的排序后Map.Entry列表:
方案一:直接收集原Entry对象(最简单)
其实你完全不需要额外转换,entrySet()返回的集合里每个元素本身就是Map.Entry实例,排序后直接收集成List就行:
List<Map.Entry<String, AtomicInteger>> expectedList = expectedMap.entrySet().stream() .sorted(Comparator.comparing(e -> -e.getValue().get())) .collect(Collectors.toList());
注意:这里的Entry和原Map是关联的,如果原Map里的AtomicInteger值被修改,列表里的Entry对应值也会跟着变。如果需要和原Map解耦的独立Entry,看下面的方案。
方案二:使用AbstractMap的具体Entry实现类
Java提供了AbstractMap.SimpleEntry(可变)和AbstractMap.SimpleImmutableEntry(不可变)这两个Map.Entry的具体实现类,你可以用它们来包装原Entry的键值:
import java.util.AbstractMap; // 可变Entry,允许后续修改键值 List<Map.Entry<String, AtomicInteger>> expectedList = expectedMap.entrySet().stream() .sorted(Comparator.comparing(e -> -e.getValue().get())) .map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), e.getValue())) .collect(Collectors.toList()); // 不可变Entry,创建后无法修改键值 List<Map.Entry<String, AtomicInteger>> immutableList = expectedMap.entrySet().stream() .sorted(Comparator.comparing(e -> -e.getValue().get())) .map(e -> new AbstractMap.SimpleImmutableEntry<>(e.getKey(), e.getValue())) .collect(Collectors.toList());
优化排序逻辑的小技巧
用负号反转排序虽然可行,但可读性稍差,推荐用reversed()方法让代码更清晰:
.sorted(Comparator.comparing( Map.Entry::getValue, Comparator.comparingInt(AtomicInteger::get) ).reversed())
这样明确表示“按AtomicInteger的值倒序排序”,比写-e.getValue().get()更容易理解。
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

