Подтвердить что ты не робот

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.

Спасибо.

4b9b3361

Ответ 1

Вы можете использовать lambda:

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

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

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

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

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

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

Ответ 2

List<Person> roster = ...;

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

который был бы переводом, но я havent запустил это или использовал API. скорее всего, вы можете заменить p → p на функцию Function.identity(). и статически импортировать toMap (...)

Ответ 3

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

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