Как конвертировать Список <Person>в Картувместо карты? - PullRequest
0 голосов
/ 23 января 2019

Учитывая, что Person класс имеет три поля: имя (String), возраст (int), оклад (double).

Я хочу создать карту с именем в качестве ключа и значением в качестве зарплаты (вместо Person самого объекта), если ключ не является уникальным, тогда используйте connectedList для хранения значений всех дубликатов ключей.

Я имею в виду решение, приведенное по ссылке ниже: Идиоматическое создание многозначной карты из потока в Java 8 , но все еще неясно, как создать хэш-карту со значением Salary в качестве значения .

Я могу создать map<String, List<Double>> с помощью forEach (). код указан ниже:

List<Person> persons= new ArrayList<>();
        persons.add(p1);
        persons.add(p2);
        persons.add(p3);
        persons.add(p4);

        Map<String, List<Double>> personsByName = new HashMap<>();

        persons.forEach(person ->
            personsByName.computeIfAbsent(person.getName(), key -> new LinkedList<>())
                    .add(person.getSalary())
        );

но я пытаюсь использовать "groupingBy & collect" для создания карты. Если мы хотим, чтобы Person сам объект как значение, тогда код приведен ниже:

Map<String, List<Person>> personsByNameGroupingBy = persons.stream()
                .collect(Collectors.groupingBy(Person::getName, Collectors.toList()));

Но я хочу создать карту с зарплатой в качестве значения, как указано ниже:

Map<String, List<Double>> 

Как добиться этого сценария?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Создайте Карту , а затем выполните forEach , для каждого элемента проверьте свою Карту , если у нее есть определенный ключ или нет, если нет, поставьте новый ключ и emptyList для сбора ваших данных. Проверьте код ниже.

Map<String, List<Double>> data = new HashMap<>();

persons.forEach(
    p->{
       String key = p.getName();
       if(!data.contains(key)){
           data.put(key, new ArrayList());
       }
       data.get(key).add(p.getSalary);
    }
);
0 голосов
/ 23 января 2019

Вы можете использовать Collectors.mapping, чтобы сопоставить экземпляры Person с соответствующими зарплатами:

Map<String, List<Double>> salariesByNameGroupingBy = 
    persons.stream()
           .collect(Collectors.groupingBy(Person::getName, 
                                          Collectors.mapping(Person::getSalary,
                                                             Collectors.toList())));
...