Если вы знаете, что у вас нет дубликатов ключей, или вы хотите, чтобы значения в map2
перезаписывали значения из map1
для дублирующих ключей, вы можете просто написать
map3 = new HashMap<>(map1);
map3.putAll(map2);
Если вам нужно большеДля управления комбинированием значений можно использовать Map.merge
, добавленный в Java 8, который использует предоставленный пользователем BiFunction
для объединения значений для дубликатов ключей.merge
работает с отдельными ключами и значениями, поэтому вам нужно использовать цикл или Map.forEach
.Здесь мы объединяем строки для дублирующих ключей:
map3 = new HashMap<>(map1);
for (Map.Entry<String, String> e : map2.entrySet())
map3.merge(e.getKey(), e.getValue(), String::concat);
//or instead of the above loop
map2.forEach((k, v) -> map3.merge(k, v, String::concat));
Если вы знаете, что у вас нет дублирующих ключей и хотите применить их принудительно, вы можете использовать функцию слияния, которая выдает AssertionError
:
map2.forEach((k, v) ->
map3.merge(k, v, (v1, v2) ->
{throw new AssertionError("duplicate values for key: "+k);}));
Отступив от этого конкретного вопроса, библиотека потоков Java 8 предоставляет toMap
и groupingBy
Collectors .Если вы неоднократно объединяете карты в цикле, вы можете реструктурировать свои вычисления, чтобы использовать потоки, которые могут как прояснить ваш код, так и обеспечить легкий параллелизм с использованием параллельного потока и одновременного сборщика.