public static <K, V extends Comparable<? super V>>
Comparator<Map.Entry<K, V>> comparingByValue()
является статическим методом и требует K, V
для правильной установки / исправления / корректировки общего контекста, когда он используется в одном из них.В противном случае предполагается, что K
равно Object
, а V
равно Comparable
, что не соответствует ожиданиям Stream<Map.Entry<Integer, Integer>>#sorted
.Обратите внимание, что поток получил <Map.Entry<Integer, Integer>>
из map.entrySet()
, где map
параметризован <Integer, Integer>
или типом результата sortedMap
, который равен Map<Integer, Integer>
.
Map.Entry.<Integer, Integer>comparingByValue()
дает подсказки, необходимые, чтобы решить это красиво.
Map.Entry.comparingByValue()
, как есть, очень неопределенная вещь, чтобы написать.
Comparator<Map.Entry<Object, Comparable<Comparable<?>>>>
comparator = comparingByValue();
Это становится более значимым, когда вы даете ему общий контекст.
Comparator<Map.Entry<Integer, Integer>>
comparator = comparingByValue();
В вашем случае это важно, потому что Map.Entry.comparingByValue()
запускает цепочку и следующие методы экземпляра (например, thenComparing
) будет разрешать свои собственные общие параметры на основе общих параметров предыдущего метода (здесь comparingByValue
).