Слияние recashrive Hashmap в java 8 - PullRequest
2 голосов
/ 13 марта 2020

Мне нужно объединить несколько HashMap s

map1:

{"41666":
 {"oyo_id":"KSD900",
 "contracted_rooms":null,
 "status":"live"
 },
 "41667":
 {"oyo_id":"JGH900",
 "contracted_rooms":null,
 "status":"live"
 }
}

map2:

{"41666":
 {"oyo_id":null,
 "contracted_rooms":31,
 "status":null
 },
 "41667":
 {"oyo_id":null,
 "contracted_rooms":3,
 "status":null
 }
}

Ожидаемый результат

{"41666":
 {"oyo_id":"KSD900",
 "contracted_rooms":31,
 "status":"live"
 },
 "41667":
 {"oyo_id":"JGH900",
 "contracted_rooms":3,
 "status":"live"
 }
}

Что я пробовал:

AssignedPropertiesResponse:

@JsonProperty("oyo_id")
private String oyoId;

@JsonProperty("status")
private String status;

@JsonProperty("contractedRoomsCount")
private Double contracted_rooms_count;

AssignedPropertiesResponseList:

HashMap<String, AssignedPropertiesResponse>

map1.putAll(map2);

Но это перезаписывает значения map2 в map2.

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Создайте функцию слияния

map2.merge(key, value, (v1, v2) -> new AssignedPropertiesResponse(v1.getOyoId(),v1.getStatus(),v2.getContractedRoomsCount())

, а затем вы можете перебрать карту2 и объединить записи в map1

map2.forEach(
  (key, value) -> map1.merge(key, value, (v1, v2) -> new AssignedPropertiesResponse(v1.getOyoId(),v1.getStatus(),v2.getContractedRoomsCount())));
1 голос
/ 13 марта 2020

Вот примерная реализация:

map2.forEach((key, value) -> {
    AssignedPropertiesResponse r = map1.get(key);
    if(r != null) r.setContracted_rooms_count(value.getContracted_rooms_count());
});

PS: имена переменных пишутся с помощью camelCase в java.

...