我编写了以下方法来查找映射到最高值并尝试转换为java temp
的键。你能帮忙吗?
Stream
答案 0 :(得分:19)
我不确定你的代码试图做了哪一半,但是根据标题来回答你的问题,我猜测它是“找到具有最高价值的条目”:
Map.Entry<Integer, Long> maxEntry = map.entrySet().stream()
.max(Map.Entry.comparingByValue()).get();
答案 1 :(得分:17)
您可以通过
获得一个密钥Integer max=mapGroup.entrySet().stream().max(Map.Entry.comparingByValue()).get().getKey();
但遗憾的是,没有内置函数可以获得所有等效的最大值。
最简单,最直接的解决方案是首先找到最大值,然后检索映射到该值的所有键:
private List<Integer> testStreamMap(Map<Integer, Long> mapGroup) {
if(mapGroup.isEmpty())
return Collections.emptyList();
long max = mapGroup.values().stream().max(Comparator.naturalOrder()).get();
return mapGroup.entrySet().stream()
.filter(e -> e.getValue() == max)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
}
“How to force max() to return ALL maximum values in a Java Stream?”中讨论了在一次通过中获取流的所有最大值的解决方案。如果您的输入是普通Map
(例如HashMap
),您会看到单通道解决方案要复杂得多并且不值得花费,这可以便宜地多次迭代。