Комплексные компараторы в Java 8 - PullRequest
0 голосов
/ 09 октября 2018

Может кто-нибудь объяснить разницу между следующими вариантами сложного Comparator s?

List<String> listOfStrings = Arrays.asList("algo", "test", "is", "a", "common");

listOfStrings.stream()
             .sorted(Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()))
             .sorted(Comparator.naturalOrder().thenComparing(Comparator.comparingInt(String::length))
             .forEach(System.out::println);

Почему первый вызов sorted в порядке, а второй не может даже скомпилироваться?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Компилятор знает, что Comparator.comparingInt(String::length) возвращает Comparator<String> (поскольку вы передаете ему ToIntFunction<String>), и поэтому ожидает, что второй Comparator, переданный в thenComparing, будет Comparator<String>,поэтому он может вывести тип Comparator, возвращаемый Comparator.naturalOrder(), как Comparator<String>.

С другой стороны, когда первый Comparator возвращается Comparator.naturalOrder() (который возвращаетComparator<T>), компилятор не знает, какой тип Comparator ожидать для аргумента thenComparing, поэтому он отклоняет переданный ему Comparator<String>.

Этой ошибки можно избежать, еслиВы объявляете тип Comparator, возвращенный Comparator.naturalOrder() явно:

Comparator<String> comp = Comparator.naturalOrder();
listOfStrings.stream()
             .sorted(comp.thenComparing(Comparator.comparingInt(String::length)))
             .forEach(System.out::println);
0 голосов
/ 09 октября 2018
  1. comparingInt (ToIntFunction keyExtractor)

Принимает функцию, которая извлекает ключ int-сортировки из типа T, и возвращает Comparator, который сравнивает по этому ключу сортировки.

naturalOrder ()

Возвращает компаратор, который сравнивает сопоставимые объекты в естественном порядке.

Вы можете проверить естественный порядок оттуда; разница между естественным и общим порядком

Comparator API;https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#naturalOrder--

...