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