Отображение нескольких потоков - PullRequest
5 голосов
/ 28 апреля 2020

У меня мало Карт с одинаковым ключом name и разными типами значений.

Map<String, Long> map1 = ...
Map<String, Long> map2 = ...
Map<String, String> map3 = ...

То, чего я хочу достичь, это создать из этих трех разных карт новую карту:

Map<String, Foo> fooMap = ...

Где Foo - это класс:

class Foo {
  long val1;
  long val2;
  String val3;
}

Возможно ли это сделать с помощью Streams API?

1 Ответ

4 голосов
/ 28 апреля 2020

Вы можете Stream над записями одной из карт и сопоставить каждую запись с записью выходных данных Map:

Map<String,Foo>
   outMap = map1.entrySet()
                .stream()
                .map(e -> new SimpleEntry<>(e.getKey(),
                                            new Foo(e.getValue(),
                                                    map2.get(e.getKey()),
                                                    map3.get(e.getKey()))))
                .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));

Это предполагает, что ваш класс Foo имеет Конструктор с тремя аргументами.

РЕДАКТИРОВАТЬ: Как прокомментировал Антон, вы можете пропустить шаг map:

Map<String,Foo>
   outMap = map1.entrySet()
                .stream()
                .collect(Collectors.toMap(Map.Entry::getKey,
                                          e -> new Foo(e.getValue(),
                                                       map2.get(e.getKey()),
                                                       map3.get(e.getKey()))));
...