Как объединить две вложенные карты с одинаковыми ключами и сохранить значения

#java #list #stream #maps

#java #Список #поток #Карты

Вопрос:

У меня есть следующие карты:

 Map<String,Map<String,Long>> mapOne;
Map<String,Map<String,Long>> mapTwo;
  

Значения внутри этих карт выглядят примерно так :

 {
     BMW = {
        SIZE=1, 
        SPEED=60
    }, 
     AUDI = {
        SIZE=5, 
        SPEED=21
    },
     SEAT= {
        SPEED=15
     }
}
  

Вторая карта:

  {
         Suzuki = {
            WHEELS_SIZE=2, 
            DOORS=3
        }, 
         AUDI = {
            WHEELS_SIZE=5, 
            DOORS=5
        },
         SEAT= {
            DOORS=4
         }
    }
  

Я хочу, чтобы карта после слияния была :

 {
         BMW = {
            SIZE=1, 
            SPEED=60
        }, 
         AUDI = {
            SIZE=5, 
            SPEED=21,
            WHEELS_SIZE=5, 
            DOORS=5
        },
         SEAT= {
            SPEED=15,
            DOORS=4
         },
         Suzuki = {
            WHEELS_SIZE=2, 
            DOORS=3
        }, 
    }
  

Итак, я хочу выполнить слияние и объединить значения дубликатов ключей. Я считаю, что это должно быть что-то вроде этого:

 mapTwo.forEach((k, v) -> mapOne.merge(k, v, ..... ));
  

Ответ №1:

Вы можете написать:

 mapTwo.forEach((k, v) -> mapOne.merge(k, v, (v1,v2) -> {
                                                          v1.putAll(v2);
                                                          return v1;
                                                       }));
  

Это изменит mapOne , чтобы включить записи mapTwo , одновременно объединяя внутренние Map s общих ключей.