2016-07-31 107 views
5

你好,我有我的目标对象的名单有三个字段转换列表转换成地图<字符串,地图<字符串,整数>> java8流

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))))); 

这甚至不编译。

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

我希望我得到了你想要的正确的逻辑:帮助被链接两个groupingByCollector S和一个summingIntCollector大加赞赏

+3

请提供样品输入端,不太清楚你如何让所有的Y's和z的从一个单一的x –

+0

你不应该重复使用你的流,也不应该你需要。我认为你的问题不是Streams的一个很好的匹配,因为我认为你正在尝试将前两个元素映射到'''MyObject.x'''和第三个和第四个元素,并使用第二个元素的x值。自定义收集器可能是可能的,但是您正在操纵很多状态 – Gavin

回答

7

你可以做到这一点。

当添加到输入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}} 
相关问题