加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Streams:通过内部地图键获取值分组

发布时间:2020-12-14 05:14:26 所属栏目:Java 来源:网络整理
导读:我有Map A,Map B,C并且我想要获得地图 B,列表 C从它使用 Java Streams. 我试图这样做: public A,B,C MapB,ListC groupsByInnerKey(MapA,MapB,C input) { return input.values() .stream() .flatMap(it - it.entrySet().stream()) .collect(Collectors.group
我有Map< A,Map< B,C>>并且我想要获得地图< B,列表< C>>从它使用 Java Streams.

我试图这样做:

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

我期待什么

> flatMap给出一个Stream of Stream.Entry< B,C>
> collect(Collectors.groupingBy(…))取得应用于Map.Entry< B,C>的功能.并返回B,因此它将C的值收集到List< C>中.

但是它没有编译,从字面上来说:

Non-static method cannot be referenced from a static context

在最后一行的Map.Entry :: getKey.

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

解决方法

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

因此,您只是想要调用Collectors.mapping.这个收集器会将Stream元素映射到给定的映射器函数,并将该结果收集到下游容器中.在这种情况下,映射器是Map.Entry :: getValue(所以从map条目返回值),下游收集器收集到List中.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读