У меня есть проблема, которую я решил, но я ищу лучшее решение.
У меня большой список (допустим, 500 000) сущностей
class Entity {
String key1;
String key2;
String value1;
String value2;
}
который я хочу отобразить в мультикарту Map<String, Map<String, List<Entity>>>
на основе ключа 1 и ключа 2, так как карта верхнего уровня имеет entity.key1
в качестве ключа, а внутренняя карта - entity.key2
.
Поэтому ясконструировал класс mapper, чтобы сделать такую вещь
class EntityMapper {
Map<String, Map<String, List<Entity>>> mapByKey1AndKey2(List<Entity> entities) {
Map<String, Map<String, List<Entity>>> accountMap = new HashMap<>();
entities.forEach(
entity -> key1Map.merge(entity.key1, newKey2Map(entity), this::mergeKey2Maps)
);
return key1Map;
}
Map<String, List<Entity>> newKey2Map(Entity entity) {
Map<String, List<Entity>> key2Map = new HashMap<>();
key2Map.put(entity.key2, new ArrayList<>(singletonList(entity)));
return key2Map;
}
Map<String, List<Delta>> mergeKey2Maps(Map<String, List<Entity>> oldMap, Map<String, List<Entity>> newMap) {
for (String key2 : newMap.keySet()) {
oldMap.merge(key2, newMap.get(key2), this::mergeLists);
}
return oldMap;
}
List<Entity> mergeLists(List<Entity> oldList, List<Entity> newList) {
oldList.addAll(newList);
return oldList;
}
}
Есть ли какие-либо недостатки этого подхода?Или есть какой-нибудь способ оптимизировать его?
Отказ от ответственности: я знаю о существовании составного сопоставления клавиш, но оно не будет служить моей цели.