Сортировка LongAdder в потоках - PullRequest
0 голосов
/ 17 июня 2019

у меня

Map<String,LongAdder>

и я хочу отсортировать по значению лучший способ в потоках. Это сложнее, чем с Long, потому что LongAdder не реализует Comparable, поэтому я должен использовать longValue (или intValue, если для компаратора используется вычитание).

Я знаю, что могу использовать

m.entrySet().stream().sorted((a, b) -> b.getValue().intValue() - a.getValue().intValue())

но я на самом деле хочу также отсортировать по ключу (String). Я тоже поменяю местами.

Я хочу сделать

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 ]

1 голос
/ 17 июня 2019

Comparator.comparingLong - это то, что вам нужно:

Comparator<Map.Entry<String, LongAdder>> byCount =
    Comparator.comparingLong((Map.Entry<String, LongAdder> e) ->
        e.getValue().longValue()).reversed().thenComparing(...);

Важное примечание: не забудьте использовать лямбда-выражение с явной типизацией, в противном случае метод цепочки, такой как comparing(...).thenComparing(...) won 't в этом конкретном случае компилировать 1 .


1 - этот ответ объясняет, почему.

1 голос
/ 17 июня 2019

Ваш автономный компаратор может быть настроен на использование Function и будет выглядеть так:

Comparator<Map.Entry<String,LongAdder>> byCount = Comparator.comparingInt(e -> e.getValue().intValue());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...