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

我有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())
            ));
}

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...