2016-07-31 104 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}} 
相關問題