it-roy-ru.com

Collectors.toMap () keyMapper - более краткое выражение?

Я пытаюсь придумать более краткое выражение для параметра функции "keyMapper" в следующем вызове Collectors.toMap():

List<Person> roster = ...;

Map<String, Person> map = 
    roster
        .stream()
        .collect(
            Collectors.toMap(
                new Function<Person, String>() { 
                    public String apply(Person p) { return p.getLast(); } 
                },
                Function.<Person>identity()));

Кажется, что я должен быть в состоянии встроить его с помощью лямбда-выражения, но я не могу придумать то, что компилируется. (Я совсем новичок в лямбдах, так что это неудивительно).

Благодарю.

-> Обновление:

Как отмечено в принятом ответе

Person::getLast

это то, что я искал, и это то, что я пытался. Тем не менее, ночная сборка BETA_8 Eclipse 4.3 была проблемой - она ​​помечала это как неправильное. Когда скомпилировано из командной строки (что я должен был сделать перед публикацией), это сработало. Итак, пришло время сообщить об ошибке на Eclipse.org.

Благодарю.

68
pfurbacher

Вы можете использовать лямбду:

Collectors.toMap(p -> p.getLast(), Function.identity())

или, более кратко, вы можете использовать ссылка на метод , используя :::

Collectors.toMap(Person::getLast, Function.identity())

и вместо Function.identity вы можете просто использовать эквивалентную лямбду:

Collectors.toMap(Person::getLast, p -> p)

Если вы используете Netbeans, вы должны получать подсказки всякий раз, когда анонимный класс может быть заменен лямбда-выражением.

172
assylias
List<Person> roster = ...;

Map<String, Person> map = 
    roster
        .stream()
        .collect(
            Collectors.toMap(p -> p.getLast(), p -> p)
        );

это был бы перевод, но я не запустил это или использовал API. скорее всего, вы можете заменить p -> p на Function.identity (). и статически импортировать в карту (...)

26
aepurniet

Мы можем использовать опциональную функцию слияния также в случае одной и той же ключевой коллизии. Например, если два или более человека имеют одинаковое значение getLast (), мы можем указать, как объединять значения. Если мы этого не сделаем, мы могли бы получить исключение IllegalStateException. Вот пример для достижения этого ...

Map<String, Person> map = 
roster
    .stream()
    .collect(
        Collectors.toMap(p -> p.getLast(),
                         p -> p,
                         (person1, person2) -> person1+";"+person2)
    );
5
KayV