Сортировка по свойству в потоке Java 8

Ох, эти хитрые потоки 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()?

39
задан Misha 17 May 2016 в 18:15
поделиться