Ох, эти хитрые потоки Java 8 с лямбдами. Они очень мощные, но тонкости требуют немного, чтобы обернуть голову вокруг всего этого.
Допустим, у меня есть тип User
со свойством User.getName()
. Допустим, у меня есть карта этих пользователей Map<String, User>
, связанная с именами (например, имена пользователей для входа). Далее, скажем, у меня есть экземпляр компаратора UserNameComparator.INSTANCE
для сортировки имен пользователей (возможно, с использованием необычных коллатеров и тому подобного).
Итак, как мне получить список пользователей на карте, отсортированный по имени пользователя? Я могу игнорировать ключи карты и сделать это:
return userMap.values()
.stream()
.sorted((u1, u2) -> {
return UserNameComparator.INSTANCE.compare(u1.getName(), u2.getName());
})
.collect(Collectors.toList());
Но та строка, где я должен извлечь имя, чтобы использовать UserNameComparator.INSTANCE
, кажется слишком большой ручной работой. Есть ли способ, которым я могу просто предоставить User::getName
в качестве некоторой функции отображения, только для сортировки, и все же вернуть экземпляры User
в собранный список?
Бонус: Что, если вещь, которую я хотел сортировка была на два уровня, например, User.getProfile().getUsername()
?