将对象列表转换为<string,map <string,integer>&gt;的映射java8流

时间:2016-07-31 17:43:09

标签: java lambda java-8

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

class MyObject{
   String x;
   String y;
   int  z;
   //getters n setters
}

我需要将此列表转换为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)))));

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

1 个答案:

答案 0 :(得分: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))));

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

在输入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));

您获得了输出Map

{A={B=25, C=17}, B={C=10}}