создание карты из списка объектов, имеющих карту, используя Java Lambda8 - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть объект,

class Object2{
     String name;
     String id;
     Map<String, String> customData;
}

class Object1{
     List<Object2> obj1List;
}

Я хочу преобразовать эту карту customData из Списка объектов1 в одну карту, я согласен с перезаписью значений, если ключ уже существует.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Вот способ с лямбдами и Java 8:

Map<String, String> map = new LinkedHashMap<>();
object1List.forEach(o1 -> 
        o1.getObject1List().forEach(o2 -> map.putAll(o2.getCustomData())));
0 голосов
/ 06 декабря 2018

Кроме того, вы можете выполнить Stream.flatMap, а затем использовать Map.putAll как

List<Object1> object1s = new ArrayList<>(); // initialise as you would
Map<String, String> finalCustomData = new LinkedHashMap<>();
object1s.stream() // Stream<Object1>
        .flatMap(o1 -> o1.getObj1List().stream()) // Stream<Object2>
        .map(Object2::getCustomData) // Stream<Map<String, String>>
        .forEach(finalCustomData::putAll); 
0 голосов
/ 06 декабря 2018

Используйте flatMap и toMap следующим образом:

List<Object1> source = ...
Map<String, String> result = 
     source.stream()
           .flatMap(e -> e.getObj1List().stream()
                               .flatMap(a -> a.getCustomData().entrySet().stream()))
           .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (l, r) -> r));

или если вы имеете дело с одним Object1 объектом:

Object1 myObj = ...
Map<String, String> result = 
      myObj.getObj1List()
           .stream()
           .flatMap(a -> a.getCustomData().entrySet().stream())
           .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (l, r) -> r));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...