Java 8 преобразовать список <Object>в карту используя поля дочерних объектов объекта? - PullRequest
2 голосов
/ 08 мая 2020

Ситуация проста: у меня есть список объектов List<ParentClass> list, и я хочу преобразовать его в Map<orderKey, price>

Класс выглядит следующим образом

class ParentClass{
   Child1Class a;
   Child2Class b;
}

OrderKey class выглядит так

class orderKey{
   String id;
   String itemName;
}

Дочерние классы выглядят так:

class Child1Class{
   String id;
   String itemName;
   Date date;
   .....
}

class Child2Class{
   BigDecimal price;
   ....
}

Все классы имеют соответствующие методы получения и установки для каждого поля. Поэтому я по сути хочу отобразить поля детских полей. Как я могу это сделать?

-----------------------------MY ATTEMPT IS SOMETHING LIKE THIS--------------------------------------
list.stream().
.collect(Collectors
.toMap(ParentClass::getA, ParentClass::getB)
.entrySet().stream()
......
then I'm stuck 

Не уверен, как я могу создать временный объект orderKey в качестве ключа для новой карты. Любая помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

Попробуйте вот так. Поскольку вы не предоставили геттеры, мне пришлось получить доступ к полям. Он также предполагает конструктор OrderKey.

Map<OrderKey,BigDecimal> map = list
               .stream()
               .collect(Collectors
                         .toMap(parent ->
                             new OrderKey(parent.a.id,
                                  parent.a.itemName),
                          parent->parent.b.price));

С getters это будет выглядеть так.

    Map<OrderKey,BigDecimal> map=   
        list.stream()
            .collect(Collectors
                .toMap(parent ->
                      new OrderKey(parent.getA().getId(),
                                   parent.getA().getItemName()),
                       parent->parent.getB().getPrice()));
2 голосов
/ 08 мая 2020
Map<K, V> map = list.stream().
                  .collect(Collectors.toMap(
                     parent -> {
                       // the key in the map is of type orderKey, instantiate it here, you have "parent" which is one element of the list.
                       return new orderKey(...);
                     }, 
                     ParentClass::getB
                  ));
...