Вы можете сделать это с потоком довольно легко:
Map<T, Set<U>> merged = Stream.of(first, second)
.map(Map::entrySet)
.flatMap(Set::stream)
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a, b) -> {
HashSet<U> both = new HashSet<>(a);
both.addAll(b);
return both;
}));
Это разбивает карты на их Entry
с, а затем соединяет их с Collector
, который разрешает дубликаты , добавляя оба значения к новому HashSet
.
Это также работает для любого количества карт.
Некоторые вариации, которые дают одинаковый результат:
Stream.of(first, second).flatMap(m -> m.entrySet().stream())
.collect(...);
Stream.concat(first.entrySet().stream(), second.entrySet().stream())
.collect(...); //from comment by Aleksandr Dubinsky
Третий параметр для Collectors.toMap
не требуется, если нет повторяющихся ключей.
Существует еще один Collectors.toMap
с четвертым параметром, который позволяет вам выбрать тип Map
, собранных в.