2016-07-31 11 views
5

witam mam listę obiektów mój obiekt posiada trzy polalista konwersji obiektu na mapie <String, Map <String, Integer >> java8 strumieni

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

muszę przekonwertować ten wykaz do Map<String,Map<String,Integer>>

to jest tak: {x1:{y1:z1,y2:z2,y3:z3},x2{y4:z4,y5:z5}} format Chcę to zrobić w Javie 8, który myślę, że jestem stosunkowo nowy w tym.

Próbowałem następujące:

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

to nawet nie skompilować. pomoc jest bardzo ceniona

+3

Podaj wejście próbkowania, nie jest jasne, w jaki sposób można uzyskać wszystkie te Y i Z. z pojedynczego x –

+0

Nie powinieneś ponownie wykorzystywać swojego strumienia, tak jak nie musisz. Nie sądzę, że problem jest dobry dla Strumieni, ponieważ myślę, że próbujesz wziąć pierwsze dwa elementy i zamapować je na '' 'MyObject.x''' oraz trzeci i czwarty element i mapować je za pomocą drugie elementy x wartość. Może to być możliwe dzięki niestandardowemu kolektorowi, ale manipulujesz wieloma stanami – Gavin

Odpowiedz

7

Można to zrobić przez łańcuchowym dwa groupingByCollector s oraz jeden summingIntCollector:

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

mam nadzieję mam logikę chciałeś prawo.

Dodając do wejścia List następujące:

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

Otrzymasz wyjście Map od:

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