我有
Map<String,LongAdder>
,我想按值对流中的最佳方式进行排序。这比Long难,因为LongAdder没有实现Comparable,因此我必须使用longValue(如果使用减法来创建Comparator,则必须使用intValue)。
我知道我可以使用
m.entrySet().stream().sorted((a, b) -> b.getValue().intValue() - a.getValue().intValue())
但是我实际上还想对键(字符串)进行第二排序。我也在颠倒排序。
我想做
m.entrySet().stream().sorted(
Comparator.comparing((a, b) -> b.getValue().intValue() - a.getValue().intValue()))
以便以后可以使用thenComparing()链接更多的比较器
例外是
Lambda expression's signature does not match the signature of the functional interface method apply(T)
但是,即使声明一个独立的比较器也不起作用:
Comparator<Map.Entry<String,LongAdder>> byCount = Comparator.comparing((a,b) ->
(b.getValue().intValue() - a.getValue().intValue()));
Lambda expression's signature does not match the signature of the functional interface method apply(T)
我不能使用功能性引用“ ::”,因为它包含太多部分:Map.Entry.getValue()。intValue()。
答案 0 :(得分:1)
您的独立比较器可以固定为使用Function
,并且看起来像:
Comparator<Map.Entry<String,LongAdder>> byCount = Comparator.comparingInt(e -> e.getValue().intValue());
答案 1 :(得分:1)
Comparator.comparingLong
是您所需要的:
Comparator<Map.Entry<String, LongAdder>> byCount =
Comparator.comparingLong((Map.Entry<String, LongAdder> e) ->
e.getValue().longValue()).reversed().thenComparing(...);
重要说明:不要忘记使用显式类型的lambda表达式,否则在这种特殊情况下,像comparing(...).thenComparing(...)
这样的方法链将不会编译。 1 。
1-此answer解释了原因。