Ваш компаратор предназначен для String
объектов, но map.entrySet().stream()
возвращает поток Entry<String, FullName>
объектов.
Как было предложено JB в комментариях, вы можете использовать статический Comparator
метод #comparing
для быстрого создания Comparator
:
List<String> listofIds = map.entrySet().stream().sorted(
Comparator.comparing(e -> e.getValue().getName().getFirstName())
).map(Map.Entry::getKey).collect(toList());
Вы можете воспользоваться Comparator
, являющимся функциональным интерфейсом, подобным следующему:
List<String> listofIds = map.entrySet().stream().sorted(
(e1, e2) -> e1.getValue().getName().getFirstName().compareTo(
e2.getValue().getName().getFirstName())
).map(Map.Entry::getKey).collect(toList());
Если вы все еще хотите использовать Comparator
объект, вы можете использовать:
private static class ValueComparator implements Comparator<Entry<String, FullName>> {
@Override
public int compare(Entry<String, FullName> e1, Entry<String, FullName>> e2) {
FullName fullName1 = e1.getValue();
FullName fullName2 = e2.getValue();
return fullName1.getName().getFirstName()
.compareTo(fullName2.getName().getFirstName());
}
}