Компаратор.reversed () не компилируется с использованием лямбда


у меня есть список с некоторыми пользовательскими объектами, и я пытаюсь отсортировать список, но работает только с помощью ссылки на метод, с лямбда-выражением компилятор выдает ошибку:

List<User> userList = Arrays.asList(u1, u2, u3);
userList.sort(Comparator.comparing(u -> u.getName())); // works
userList.sort(Comparator.comparing(User::getName).reversed()); // works
userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error

ошибка:

comjava8collectionapiCollectionTest.java:35: error: cannot find symbol
            userList.sort(Comparator.comparing(u -> u.getName()).reversed());
                                                     ^
symbol:   method getName()
location: variable u of type Object
1 error
2 76

2 ответа:

это слабое место в механизме вывода типа компилятора. Для того, чтобы вывести тип u в лямбде, то цели типа лямбда должна быть создана. Это достигается следующим образом. userList.sort() ожидает аргумент типа Comparator<User>. В первой строке Comparator.comparing() до Comparator<User>. Это означает, что Comparator.comparing() нужен Function что происходит

вы можете обойти это ограничение с помощью двух аргументов Comparator.comparing С Comparator.reverseOrder() в качестве второго аргумента:

users.sort(comparing(User::getName, reverseOrder()));