当前位置:  开发笔记 > 编程语言 > 正文

Java Streams:获取按内部映射键分组的值

如何解决《JavaStreams:获取按内部映射键分组的值》经验,为你挑选了2个好方法。

我有Map>,我想Map>使用Java Streams 从中获取.

我尝试按如下方式进行:

public  Map> groupsByInnerKey(Map> input) {
    return input.values()
            .stream()
            .flatMap(it -> it.entrySet().stream())
            .collect(Collectors.groupingBy(Map.Entry::getKey));
}

我期待的是:

flatMap给人StreamMap.Entry

collect(Collectors.groupingBy(...))获取应用于Map.Entry和返回的函数B,从而收集C到的值List.

但它没有编译,字面意思:

无法从静态上下文引用非静态方法

Map.Entry::getKey最后一行.

有人可以解释什么是错的或什么是实现我想要的正确方法?



1> Tunaki..:

您的Stream由Map.Entry对象组成,但是您希望收集的实际上是条目的值,而不是条目本身.使用您当前的代码,您将获得一个Map>>.

因此,你只是错过了一个电话Collectors.mapping.此收集器将使用给定的映射器函数映射Stream元素,并将该结果收集到下游容器中.在这种情况下,映射器是Map.Entry::getValue(所以从映射条目返回值),下游收集器收集到List.

public  Map> groupsByInnerKey(Map> input) {
    return input.values()
            .stream()
            .flatMap(it -> it.entrySet().stream())
            .collect(Collectors.groupingBy(
                 Map.Entry::getKey,
                 Collectors.mapping(Map.Entry::getValue, Collectors.toList())
            ));
}



2> Eran..:

您的流管道返回a Map>>,而不是a Map>.

要得到什么Map>,你需要添加一个mapping映射Map.EntryC:

return input.entrySet()
        .stream()
        .flatMap(it -> it.getValue().entrySet().stream())
        .collect(Collectors.groupingBy(Map.Entry::getKey,Collectors.mapping(Map.Entry::getValue,Collectors.toList())));

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有