我有以下代码:
class Scratch {
public static void main(String[] args) {
Map<String, Id> idDefinitions = Map.of(
"A", new Id(Group.GROUP_A),
"B", new Id(Group.GROUP_B),
"C", new Id(Group.GROUP_A));
Map<String, Object> ids = Map.of("A", new Object(), "B", new Object(), "C", new Object());
Map<Group, Map<String, Object>> idsByGroup = ?
}
private static class Id {
private Group group;
public Id(Group group) {
this.group = group;
}
}
private enum Group {
GROUP_A,
GROUP_B
}
}
基于 idDefinitions 和 ids,我想创建一个新的 Map,其中所有 id 均按其组进行分组。我可以使用 for 循环迭代地解决这个问题,但我想知道是否有流替代方案,使用 groupingBy 收集器。
如果您只是使用
Collectors.groupingBy
按 Group
进行分组。这会给你一个Map<Group, List<Map.Entry<String, Id>>>
但是我们希望地图的值是另一个
Map
,因此我们应该将下游收集器传递给groupingBy
,即toMap
收集器。下游是 Map.Entry<String, Id>
流,因此地图的键将是 entry.getKey
,值将是 Object
中的 ids
。
Map<Group, Map<String, Object>> idsByGroup = idDefinitions
.entrySet().stream()
.collect(
Collectors.groupingBy(
x -> x.getValue().group,
Collectors.toMap(
Map.Entry::getKey,
x -> ids.get(x.getKey())
)
)
);