如何使用 Java 8 groupingBy 收集到不同类型的列表中?
How do I use Java 8 groupingBy to collect into a list of a different type?
我正在尝试获取 A -> A
类型的地图,并将其分组为 A to List<A>
类型的地图。 (也是颠倒键值关系,但我认为这不一定相关)。
这是我现在拥有的:
private static Map<Thing, List<Thing>> consolidateMap(Map<Thing, Thing> releasedToDraft) {
// Map each draft Thing back to the list of released Things (embedded in entries)
Map<Thing, List<Map.Entry<Thing, Thing>>> draftToEntry = releasedToDraft.entrySet().stream()
.collect(groupingBy(
Map.Entry::getValue,
toList()
));
// Get us back to the map we want (Thing to list of Things)
return draftToEntry.entrySet().stream()
.collect(toMap(
Map.Entry::getKey,
ThingReleaseUtil::entriesToThings
));
}
private static List<Thing> entriesToThings(Map.Entry<Thing, List<Map.Entry<Thing, Thing>>> entry) {
return entry.getValue().stream()
.map(Map.Entry::getKey)
.collect(toList());
}
我想在单个语句中执行此操作,我觉得必须可以将 Map<Thing, List<Map.Entry<Thing, Thing>>>
转换为 Map<Thing, List<Thing>>
作为 groupingBy
操作的一部分。
我试过使用 reducing()
,自定义收集器,我能找到的一切;但我受困于缺乏复杂的例子,事实上我能找到的几个类似的例子有 List.of()
,Java 8 (Collections.singletonList()
似乎不是一个好的替代品。
有人可以帮我解决可能很明显的问题吗?
必须在线
private static Map<Thing, List<Thing>> consolidateMap(Map<Thing, Thing> releasedToDraft) {
return releasedToDraft.entrySet().stream()
.collect(groupingBy(
Map.Entry::getValue,
mapping(Map.Entry::getKey, toList())
));
}
我正在尝试获取 A -> A
类型的地图,并将其分组为 A to List<A>
类型的地图。 (也是颠倒键值关系,但我认为这不一定相关)。
这是我现在拥有的:
private static Map<Thing, List<Thing>> consolidateMap(Map<Thing, Thing> releasedToDraft) {
// Map each draft Thing back to the list of released Things (embedded in entries)
Map<Thing, List<Map.Entry<Thing, Thing>>> draftToEntry = releasedToDraft.entrySet().stream()
.collect(groupingBy(
Map.Entry::getValue,
toList()
));
// Get us back to the map we want (Thing to list of Things)
return draftToEntry.entrySet().stream()
.collect(toMap(
Map.Entry::getKey,
ThingReleaseUtil::entriesToThings
));
}
private static List<Thing> entriesToThings(Map.Entry<Thing, List<Map.Entry<Thing, Thing>>> entry) {
return entry.getValue().stream()
.map(Map.Entry::getKey)
.collect(toList());
}
我想在单个语句中执行此操作,我觉得必须可以将 Map<Thing, List<Map.Entry<Thing, Thing>>>
转换为 Map<Thing, List<Thing>>
作为 groupingBy
操作的一部分。
我试过使用 reducing()
,自定义收集器,我能找到的一切;但我受困于缺乏复杂的例子,事实上我能找到的几个类似的例子有 List.of()
,Java 8 (Collections.singletonList()
似乎不是一个好的替代品。
有人可以帮我解决可能很明显的问题吗?
必须在线
private static Map<Thing, List<Thing>> consolidateMap(Map<Thing, Thing> releasedToDraft) {
return releasedToDraft.entrySet().stream()
.collect(groupingBy(
Map.Entry::getValue,
mapping(Map.Entry::getKey, toList())
));
}