将对象列表转换为<String,Map <String,Integer >> java8流的映射

Muh*_*ahy 5 java lambda java-8

你好,我有一个对象列表,我的对象有三个字段

class MyObject{
   String x;
   String y;
   int  z;
   //getters n setters
}
Run Code Online (Sandbox Code Playgroud)

我需要将此列表转换为 Map<String,Map<String,Integer>>

就像这样: {x1:{y1:z1,y2:z2,y3:z3},x2{y4:z4,y5:z5}}格式我想在Java 8中这样做,我认为我相对较新.

我尝试过以下方法:

Map<String,Map<String,Integer>> map=list.stream().
                collect(Collectors.
                        groupingBy(MyObject::getX,list.stream().
                                collect(Collectors.groupingBy(MyObject::getY,
                                        Collectors.summingInt(MyObject::getZ)))));
Run Code Online (Sandbox Code Playgroud)

这甚至没有编译.非常感谢帮助

Era*_*ran 7

你可以通过链接两个groupingBy Collector和一个来做到这一点summingInt Collector:

Map<String,Map<String,Integer>> map = 
    list.stream()
        .collect(Collectors.
                    groupingBy(MyObject::getX,
                               Collectors.groupingBy(MyObject::getY,
                                                     Collectors.summingInt(MyObject::getZ))));
Run Code Online (Sandbox Code Playgroud)

我希望我能得到你想要的逻辑.

添加到输入时List,以下内容:

list.add(new MyObject("A","B",10));
list.add(new MyObject("A","C",5));
list.add(new MyObject("A","B",15));
list.add(new MyObject("B","C",10));
list.add(new MyObject("A","C",12));
Run Code Online (Sandbox Code Playgroud)

你得到一个输出Map:

{A={B=25, C=17}, B={C=10}}
Run Code Online (Sandbox Code Playgroud)