我有一个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();
这看起来很糟糕,需要完全不必要的类型转换。有更好的方法吗?
答案 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);