使用Java8 Stream从map中查找最高值

时间:2017-02-06 04:25:44

标签: java java-8 java-stream

我编写了以下方法来查找映射到最高值并尝试转换为java temp的键。你能帮忙吗?

Stream

2 个答案:

答案 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),您会看到单通道解决方案要复杂得多并且不值得花费,这可以便宜地多次迭代。