【问题标题】:java Stream collect to TreeMap in reverse orderjava Stream以相反的顺序收集到TreeMap
【发布时间】:2019-11-23 18:03:54
【问题描述】:
我有以下代码从流中收集地图,并将其转换为树图
Map<String, String> result = myMap.values().stream().collect(Collectors.toMap(Person::getScore, Person::getName));
return new TreeMap<>(result);
有没有办法可以在同一行中返回降序排序的 treeMap?我不能将比较器作为参数传递。
【问题讨论】:
标签:
java
maps
java-stream
treemap
【解决方案1】:
我认为您可以使用返回收集器的四个参数toMap 方法。假设getScore 方法返回一个Integer(或者如果你愿意,你可以使用String,但我认为它会不太有用):
//supplier of TreeMap with your custom comparator
Supplier<TreeMap<Integer, String>> myMapSupplier = () -> new TreeMap<>(Comparator.reverseOrder());
Map<Integer, String> result = myMap.values()
.stream()
.collect(Collectors.toMap(Person::getScore, Person::getName, (s, s2) -> s, myMapSupplier));
最后一个元素是Map 的供应商。正如documentation 所说:
mapSupplier - 返回一个新的空Map 结果将插入其中的函数
因此,您仍然可以在一次调用中使用 TreeMap 和自定义 Comparator。
【解决方案2】:
您可以使用sorted 和Comparator 并使用LinkedHashMap 收集如下,
Map<String, String> result = myMap.values().stream()
.sorted(Comparator.comparing(Person::getScore, Comparator.reverseOrder()))
.collect(Collectors.toMap(Person::getScore, Person::getName, (x, y) -> x,LinkedHashMap::new));
我建议使用int 作为分数,因为字符串会在词法上进行比较。所以你的结果图是Map<Integer, String>。
希望对你有帮助。