如何使用Java8GroupingBy收集到不同类型的列表中?
我正在尝试获取类型为如何使用Java8GroupingBy收集到不同类型的列表中?,java,java-8,reducing,groupingby,Java,Java 8,Reducing,Groupingby,我正在尝试获取类型为a->a的映射,并将其分组为a的映射以列出。(也颠倒了关键价值关系,但我认为这并不一定相关) 这就是我现在拥有的: private static Map<Thing, List<Thing>> consolidateMap(Map<Thing, Thing> releasedToDraft) { // Map each draft Thing back to the list of released Things (embedde
a->a
的映射,并将其分组为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());
}
private static Map consolidateMap(Map releasedToDraft){
//将每个草稿内容映射回已发布内容列表(嵌入条目)
Map draftToEntry=releasedToDraft.entrySet().stream()
.收集(分组)(
Map.Entry::getValue,
托利斯特()
));
//让我们回到我们想要的地图(事物列表)
返回draftToEntry.entrySet().stream()
.收集(
Map.Entry::getKey,
ThingReleaseUtil::entriesToThings
));
}
私有静态列表项(Map.Entry){
返回条目.getValue().stream()
.map(map.Entry::getKey)
.collect(toList());
}
我想在一条语句中实现这一点,我觉得必须能够将Map
转换为Map
,作为groupingBy
操作的一部分
我试过使用reduce()
,自定义收集器,我能找到的一切;但是,由于缺少复杂的示例,以及我能找到的几个类似的示例都有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())
));
}
private static Map consolidateMap(Map releasedToDraft){
返回releasedToDraft.entrySet().stream()
.收集(分组)(
Map.Entry::getValue,
映射(Map.Entry::getKey,toList())
));
}
代替List.of()
您可以使用Arrays.asList()
。此外,List.of()
创建了一个不可变的列表,因此,如果您想修改它,您需要将它包装在您最喜欢的List
实现的构造函数中。@Burry Wombat您能告诉我您编辑了什么以及为什么吗?没有编辑注释,差异似乎没有显示任何更改。只是格式化了代码,但看起来好像您同时进行了一些重新格式化。我知道我犯了什么错误。键/值被反转。所以它起作用了。试试这个<代码>地图地图=地图(1,1,3,1,5,1,6,2,8,2,10,2)代码>将其用作测试映射。然后,它将有1个映射到奇数值列表,2个映射到偶数值列表。所以我最初的陈述是错误的。你的答案很好,回答得很好。对于收集器的不一致静态导入
。
api,只要做一点小改动就好了。将所有静态更改收集器。映射
导入映射
或以其他方式导入。旁白:如果一个现有的答案(如您所链接的)已经解决了这个问题,请将它标记为一个重复的答案。@Naman我使用eclipse,坦率地说,它对静态类的支持并不那么好。它们不像其他导入那样“粘性”。@WJS好吧,相反,我并没有真正使用Eclipse。但是如果它不是粘性的,那么所有这些都应该是收集器。
合格的,如.collect(Collectors.groupby(Map.Entry::getValue,Collectors.mapping(Map.Entry::getKey,Collectors.toList())
。其主要目的是要求确保一致性,无论哪一个是首选的。@WJS“粘性”是什么意思?我对Eclipse和导入静态代码没有任何问题…