【发布时间】:2019-12-11 00:43:47
【问题描述】:
我正在尝试获取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() 似乎不是一个好的替代品)。
有人可以帮我解决可能很明显的问题吗?
【问题讨论】:
-
您可以使用
Arrays.asList()代替List.of()。此外,List.of()创建了一个不可变列表,因此如果要修改它,您需要将其包装在您最喜欢的List实现的constructor中。 -
@Scary Wombat 你能告诉我你编辑了什么,为什么?没有编辑评论,差异似乎没有显示任何变化。
-
刚刚格式化了您的代码,但看起来您同时进行了一些重新格式化。
标签: java java-8 reducing groupingby