2015-11-11 15 views
6

I Hava listę klasy A jakJava 8 list do zagnieżdżonego mapie

class A { 
private Integer keyA; 
private Integer keyB; 
private String text; 
} 

Chcę przenieść aList do zagnieżdżony Map odwzorowanym przez keyA i keyB

Więc tworzę poniżej kodu.

Map<Integer, Map<Integer,List<A>>> aMappedByKeyAAndKeyB = aList.stream() 
    .collect(Collectors.collectingAndThen(Collectors.groupingBy(A::getKeyA), result -> { 
     Map<Integer, Map<Integer, List<A>>> nestedMap = new HashMap<Integer, Map<Integer, List<A>>>(); 
     result.entrySet().stream().forEach(e -> {nestedMap.put(e.getKey(), e.getValue().stream().collect(Collectors.groupingBy(A::getKeyB)));}); 
     return nestedMap;})); 

Ale nie podoba mi się ten kod.

Myślę, że jeśli użyję flatMap, mogę lepiej kodować niż to.

Ale nie wiem Jak używać flatMap dla tego zachowania.

Odpowiedz

11

Wydaje się, że po prostu trzeba kaskadowe groupingBy:

Map<Integer, Map<Integer,List<A>>> aMappedByKeyAAndKeyB = aList.stream() 
    .collect(Collectors.groupingBy(A::getKeyA, 
       Collectors.groupingBy(A::getKeyB))); 
Powiązane problemy