Java Streaming:如果没有重复项,则获取最大值

时间:2017-08-10 21:48:25

标签: java-8 java-stream

我正在尝试编写一个接收Map并返回Entry的函数。如果具有最大整数值的条目是唯一的,则应返回该条目。但是,如果有重复的条目具有相同的最大值,它应该返回一个键为“MULTIPLE”且值为0的新条目。我很容易得到忽略重复的最大值:

public static Entry<String,Integer> getMax(Map<String,Integer> map1) {
    return map1.entrySet().stream()
                          .max((a,b) -> a.getValue().compareTo(b.getValue()))
                          .get();
}

但是为了让我做我最初说的话,我只能找到一个解决方案,我必须创建一个初始流来进行布尔检查,如果有多个最大值,然后再做另一个流,如果没有得到值。我想找到一个解决方案,我可以用一个流来完成这两个任务。

这是我的小测试案例:

   @Test
   public void test1() {
         Map<String,Integer> map1 = new HashMap<>();
         map1.put("A", 100);
         map1.put("B", 100);
         map1.put("C", 100);
         map1.put("D", 105);

         Assert.assertEquals("D", getMax(map1).getKey());

         Map<String,Integer> map2 = new HashMap<>();
         map2.put("A", 100);
         map2.put("B", 105);
         map2.put("C", 100);
         map2.put("D", 105);

         Assert.assertEquals("MULTIPLE", getMax(map2).getKey());

1 个答案:

答案 0 :(得分:1)

这是一个简单的简化案例,您不需要任何外部库。

Map.Entry<String, Integer> max(Map<String, Integer> map) {
    return map.entrySet().stream()
            .reduce((e1, e2) -> {
                if (e1.getValue() == e2.getValue()) {
                    return new SimpleImmutableEntry<>("MULTIPLE", 0);
                } else {
                    return Collections.max(asList(e1, e2), comparingInt(Map.Entry::getValue));
                }
            })
            .orElse(new SimpleImmutableEntry<>("NOT_FOUND", 0));
}