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())
));
假设我通过 .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())
));