Правильный способ построения мультикарты - PullRequest
0 голосов
/ 17 октября 2018

У меня есть проблема, которую я решил, но я ищу лучшее решение.

У меня большой список (допустим, 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;
    }
}

Есть ли какие-либо недостатки этого подхода?Или есть какой-нибудь способ оптимизировать его?

Отказ от ответственности: я знаю о существовании составного сопоставления клавиш, но оно не будет служить моей цели.

1 Ответ

0 голосов
/ 17 октября 2018

Я думаю, что это должно работать:

Map<String, Map<String, List<Entity>> groupedEntities = 
    entities.stream()
            .collect(Collectors.groupingBy(e -> e.key1,
                     Collectors.groupingBy(e -> e.key2)));

Сначала я группирую список по key1, затем я группирую значения результирующего Map по key2.

...