Похоже, что java не определяет тип, если у вас есть второй уровень.
В первом примере.
data.sort( Comparator.comparing( e-> e.get(0) ) );
Тип определяется из данных, но в второй пример.
data.sort( Comparator.comparing( e-> e.get(0) ).reversed() );
Тип «сравнения» не подразумевается. Вы можете решить эту проблему двумя способами, самый простой - быть явным.
data.sort( Comparator.comparing( (List<String> e) -> e.get(0) ).reversed() );
Кажется забавным, что java не связывает выводы. Если мы включим промежуточный этап создания компаратора, мы довольно ясно увидим, что это не так.
Comparator<List<String>> c = Comparator.comparing( e-> e.get(0) ).reversed();
| Ошибка: | Не могу найти символ | символ: метод get (int) | Компаратор c = Comparator.comparing (e-> e.get (0)) .reversed (); | ^ --- ^ | Ошибка: | несовместимые типы: java .util.Comparator нельзя преобразовать в java .util.Comparator > | Компаратор c = Comparator.comparing (e-> e.get (0)) .reversed (); | ^ -------------------------------------------- ^
Теперь мы получаем две ошибки: одну в лямбде, потому что аргумент - это объект, и вторая ошибка, потому что мы создаем компаратор. .
Я думаю, это работает Кстати, но я не знаю, как это проверить. 'reversed' примет аргумент типа вызывающего его экземпляра, тип не выводится. К моменту вызова «обратного» объект должен быть создан и назначен generi c. Тогда вызов сравнения не имеет верхней границы, он просто должен вернуть Comparator .
Альтернативное решение, укажите типы при вызове Comparator.
Comparator<List<String>> c = Comparator.<List<String>, String>comparing( e->e.get(0) ).reversed();