Map<String, List<String, Object>> 当键存在时添加新的列表条目

Map<String, List<String, Object>> add new list entry when key exists

假设我通过 .entrySet().stream()

遍历条目时得到 Map<ID, Object>

我想把它映射到Map<String, List<Map<String, Object>>

使用 toMap() 时,我将初始映射的 ID 更改为字符串(通过数据库调用),但不同的 ID 可以 return 相同的字符串,因此可能存在重复。如果我的密钥已经存在于我正在收集的新地图的 toMap 中,我的 ObjectOne 是否有可能以 Map<String, List<Map<String, Object>> .

的格式添加到我的新地图的新列表条目中

我尝试了 Collectors.groupingBy()Collectors.mapping() 的东西,但没有让它工作,很好奇是否有办法做到这一点

我现在得到的是以下解决方案,但我想收集它来映射而不用先定义它:

  Map<String, List<Map<String, Object>>> giantMap = new HashMap<>();
   
  initalMap.forEach((id, object) -> {
      Code code = repository.getCodeById(id);
      giantMap.computeIfAbsent(code, ignore -> new ArrayList<>())
                        .add(object);
   });

所以,我们假设有一些 ID 到 ObjectOne 类型对象的映射:Map<ID, ObjectOne>

通过数据库调用将密钥 ID 转换为某些 Code 类型,并且使用 Collectors.groupingBy 和 [= 将第一个映射的 ObjectOne 值收集到另一个映射中17=] 如最初预期的那样:

Map<ID, ObjectOne> initialMap = ...;

Map<Code, List<ObjectOne>> mapByCode = initialMap
        .entrySet()
        .stream() // Stream<Map.Entry<ID, ObjectOne>>
        .collect(Collectors.groupingBy(
            e -> repository.getCodeById(e.getKey()),
            Collectors.mapping(Map.Entry::getValue, Collectors.toList())
        ));

此外,初始地图的 keySet 可以迭代:

// or using keySet()
Map<Code, List<ObjectOne>> mapByCode2 = initialMap
        .keySet()
        .stream() // Stream<ID>
        .collect(Collectors.groupingBy(
            repository::getCodeById,
            Collectors.mapping(initialMap::get, Collectors.toList())
        ));