如何使用 Java 8 groupingBy 收集不同类型的列表?

orb*_*ish 2 java reducing java-8 groupingby

我正在尝试获取类型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());
}
Run Code Online (Sandbox Code Playgroud)

我想在单个语句中执行此操作,并且我觉得必须可以将Map<Thing, List<Map.Entry<Thing, Thing>>>toMap<Thing, List<Thing>>作为groupingBy操作的一部分进行转换。

我试过使用reducing()自定义收集器,我能找到的一切;但我因缺乏复杂的例子而受阻,而且我能找到的几个类似的例子List.of()在 Java 8 中不存在(Collections.singletonList()似乎不是一个好的替代品)。

有人可以帮助我解决可能显而易见的问题吗?

gur*_*oso 5

必须在线

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())
                ));
    }
Run Code Online (Sandbox Code Playgroud)

  • @WJS 嗯,相反,我并没有真正使用 Eclipse。但如果它不具有粘性,那么所有这些用法都应该是“Collectors.”限定的,如“.collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList)” ())))`。主要动机是要求确保一致性,无论首选哪种。 (2认同)