Класс таймера на карту - PullRequest
       10

Класс таймера на карту

0 голосов
/ 28 августа 2018

Например, у меня есть класс Person

class Person {

    private String firstName;
    private String lastName;
    private String street;

    ...
}

Кроме того, у меня есть List<Person> personList, который содержит несколько Person объектов. Цель состоит в том, чтобы поместить эти объекты в Map<Person, Timer> personMap в качестве ключей и добавить new Timer() объекты в качестве значений. Таким образом, у каждого Person есть один Timer().
Я пытаюсь сделать следующее:

personMap = personList.stream().collect(toMap(person -> person, new Timer()));

Но компилятор говорит: there is no instance(s) of type variable(s) T, U exist so that Timer conforms to Function<? super T, ? extends U>. Я искал здесь into Map"> Список Java 8 в Map , но он не работает для меня.

Чего мне не хватает? Что не так с Timer() классом?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Второй аргумент toMap является функцией (Function<? super Person, ? extends Timer> valueMapper в данном случае).

new Timer() - это не экземпляр Function, это экземпляр Timer (что объясняет ошибку несоответствия типов аргументов). Вы можете решить проблему с помощью:

Map<Person, Timer> map = personList.stream()
        .collect(Collectors.toMap(Function.identity(), person -> new Timer()));

person -> new Timer() - лямбда-выражение с сигнатурой ожидаемой функции.

0 голосов
/ 28 августа 2018

Вы должны предоставить функцию для и клавиши и vaue для Collectors::toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper), где:

keyMapper - функция отображения для создания ключей

valueMapper - функция отображения для получения значений

Вам нужно:

Map<Person, Timer> personMap = personList.stream()
    .collect(Collectors.toMap(
        person -> person,           // Function to create a key
        person -> new Timer()));    // Function to create a value

Для лучшего понимания вот лямбды, представленные в виде анонимных классов с использованием того же самого Сборщика:

new ArrayList<Person>().stream().collect(Collectors.toMap(
        new Function<Person, Person>() {                    // Function to create a key
            @Override
            public Person apply(Person person) {
                return person;                              // ... return self
            }},
        new Function<Person, Timer>() {                     // Function to create a value
            @Override
            public Timer apply(Person person) {
                return new Timer();                         // ... return a new Timer
            }}
    ));
...