在流中排序LongAdder

时间:2019-06-17 14:13:24

标签: java sorting java-stream

我有

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()。

2 个答案:

答案 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解释了原因。