Java 构造多重映射的正确方法

Java 构造多重映射的正确方法,java,dictionary,multimap,Java,Dictionary,Multimap,我有一个问题已经解决了,但我正在寻找更好的解决办法 我有一个(假设50万)实体的大列表 我想基于key1和key2将其映射到一个multimapmap,顶级映射将entity.key1作为键,内部映射为entity.key2 因此,我构建了一个映射器类来做这样的事情 class EntityMapper { Map<String, Map<String, List<Entity>>> mapByKey1AndKey2(List<Entity>

我有一个问题已经解决了,但我正在寻找更好的解决办法

我有一个(假设50万)实体的大列表

我想基于key1和key2将其映射到一个multimap
map
,顶级映射将
entity.key1
作为键,内部映射为
entity.key2

因此,我构建了一个映射器类来做这样的事情

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;
    }
}
class EntityMapper{
映射MapByKey1和Key2(列出实体){
Map accountMap=newhashmap();
实体。forEach(
entity->key1Map.merge(entity.key1,newKey2Map(entity),this::MergeKey2Map)
);
返回键1Map;
}
映射newKey2Map(实体){
Map key2Map=newhashmap();
key2Map.put(entity.key2,新数组列表(singletonList(entity));
返回键2map;
}
映射合并键2映射(映射旧映射、映射新映射){
for(字符串key2:newMap.keySet()){
合并(key2,newMap.get(key2),this::mergeLists);
}
返回旧地图;
}
列表合并列表(列表旧列表、列表新列表){
oldList.addAll(newList);
返回旧列表;
}
}
这种方法有什么缺点吗?或者有没有办法优化它


免责声明:我知道复合密钥映射的存在,但它不符合我的目的。我认为这应该可以:

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

我首先根据
key1
对列表进行分组,然后根据
key2
对结果
Map
的值进行分组,这绝对是一个更优雅的解决方案。
Map<String, Map<String, List<Entity>> groupedEntities = 
    entities.stream()
            .collect(Collectors.groupingBy(e -> e.key1,
                     Collectors.groupingBy(e -> e.key2)));