2015-11-11 13 views
6

ich eine Liste der Klasse hava A wieJava-8-Liste, um verschachtelte Karte

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

Ich möchte aList auf verschachtelte Map abgebildet Übertragung von keyA und keyB

Also ich unten Code erstellen.

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

Aber ich mag diesen Code nicht.

Ich denke, wenn ich flatMap verwende, kann ich besser als diese Code.

Aber ich weiß nicht, wie Sie flatMap für dieses Verhalten verwenden.

Antwort

11

Es scheint, dass Sie nur eine kaskadierte groupingBy benötigen:

Map<Integer, Map<Integer,List<A>>> aMappedByKeyAAndKeyB = aList.stream() 
    .collect(Collectors.groupingBy(A::getKeyA, 
       Collectors.groupingBy(A::getKeyB))); 
Verwandte Themen