使用lambda </k,v>获取Map <k,v>的最大键

时间:2014-05-23 15:17:47

标签: java map lambda max java-8

我有一个Map<Float, String>,希望获得所有密钥的最大值。在C#中我会做这样的事情:

var dictionary = new Dictionary<float, string>{{5,"foo"}, {42, "bar"}, {0, "foobarz"}};
float max = dictionary.Max(x => x.Key); //42

现在我正在寻找一种方法来使用Java 8 lambdas做同样的事情,但我得到的最接近的是:

float max = (float)map.keySet().stream().mapToDouble((x) -> x).summaryStatistics().getMax();

这看起来很糟糕,需要完全不必要的类型转换。有更好的方法吗?

2 个答案:

答案 0 :(得分:14)

接口Stream包含方法max以获取最大元素。您可以将方法引用用作Comparator。方法max返回Optional<Float>,因为空流中没有最大元素。您可以使用方法orElse为此案例提供替代值。

float max = map.keySet().stream().max(Float::compareTo).orElse(0.0f);

答案 1 :(得分:14)

有一个比在keySet()上运行更直接的解决方案;使用添加到Map.Entry的比较器工厂直接在entrySet()上运行。

Map.Entry<K,V> maxElt = map.entrySet().stream()
                           .max(Map.Entry.comparingByKey())
                           .orElse(...);

这不仅允许获取最小/最大元素,还允许排序,因此很容易找到前十个键/值对,如下所示:

Stream<Map.Entry<K,V>> topTen = map.entrySet().stream()
                                   .sorted(Map.Entry.byKeyComparator().reversed())
                                   .limit(10);