Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java8GroupingBy收集到不同类型的列表中?_Java_Java 8_Reducing_Groupingby - Fatal编程技术网

如何使用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和导入静态代码没有任何问题…