Компаратор.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что происходит