2015-11-11 28 views
6

Tôi HAVA một danh sách các lớp A nhưJava 8 danh sách để lồng bản đồ

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

Tôi muốn chuyển aList để lồng Map ánh xạ bởi keyAkeyB

Vì vậy, tôi tạo ra bên dưới mã.

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

Nhưng tôi không thích mã này.

Tôi nghĩ Nếu tôi sử dụng flatMap, tôi có thể viết mã tốt hơn điều này.

Nhưng tôi không biết Cách sử dụng flatMap cho hành vi này.

Trả lời

11

Có vẻ rằng bạn chỉ cần một cascaded groupingBy:

Map<Integer, Map<Integer,List<A>>> aMappedByKeyAAndKeyB = aList.stream() 
    .collect(Collectors.groupingBy(A::getKeyA, 
       Collectors.groupingBy(A::getKeyB))); 
Các vấn đề liên quan