2017-10-04 32 views
3

我有一个名为Test的类。这个类有一个名为getNumber的方法,它返回一个int值。使用数据流获取最大值地图

public class Test{ 
    . 
    . 
    . 
    . 
    public int getNumber(){ 
      return number; 
    } 
} 

另外我有一个HashMap,其中的关键是一个长和值是一个测试对象。

Map<Long, Test> map = new HashMap<Long, Test>(); 

我想使用Stream Line代码打印密钥并获取具有最大getNumber的getNumber。

我可以通过以下线路

final Comparator<Test> comp = (p1, p2) -> Integer.compare(p1.getNumber(), p2.getNumber()); 

map.entrySet().stream().map(m -> m.getValue()) 
    .max(comp).ifPresent(d -> System.out.println(d.getNumber())); 

打印的最大数量不过我的问题是我怎么能返回的最大金额的关键?我可以在一轮中使用流吗?

回答

1

如果我理解正确你:

Entry<Long, Test> entry = map.entrySet() 
      .stream() 
      .max(Map.Entry.comparingByValue(Comparator.comparingInt(Test::getNumber))) 
      .get(); 
+0

它像一个魅力。非常感谢 –

+1

没有理由转向昂贵的'.sorted(...).findFirst()'。你仍然可以在OP代码中使用'max',唯一的技巧就是不执行'map'步骤:'map.entrySet().stream().max(Map.Entry.comparingByValue(Comparator.comparingInt(Test :: getNumber))).get()' – Holger

+0

@Holger再一次,你对我错了,编辑 – Eugene

1

如果你想找到对应的测试实例的最大“数”值的键值对,您可以使用Collections.max()与比较的比较合并符合此条件的条目。

import static java.util.Comparator.comparingInt; 

... 

Map.Entry<Long, Test> maxEntry = 
    Collections.max(map.entrySet(), comparingInt(e -> e.getValue().getNumber())) 

如果你想使用的流路,然后取出映射(因为你失去了与该值相关的密钥),并提供相同的比较:

map.entrySet() 
    .stream() 
    .max(comparingInt(e -> e.getValue().getNumber())) 
    .ifPresent(System.out::println); 

注意,有一个这两个片段之间的差异很小,因为如果提供的地图是空的,第一个会抛出NoSuchElementException