2017-10-09 75 views
2
Map<A, List<B>> xFunction() {  
    Map<A, List<B>> mapList = new HashMap<>(); 
    List<A> aList = x.getAList(); 
    for (A a : aList) { 
     List<B> bList = getBList(a.getId()); 
     mapList.put(a, bList); 
    } 
    return mapList; 
} 

如何将java 8与收集和分组或按映射转换?Java8:通过键映射对象列表

我尝试的东西,如:

x.getAList 
.stream() 
.map(a -> getBList(a.getId)) //return a list of B 
.collect(Collectors.groupingBy (...)) 

干杯

回答

3

@Eran是第一,但重现行为,你应该使用toMap收集与mergeFunction的重复通过a.getId(),因为默认情况下,Java将为条目提供IllegalStateException h相同的键:

x.getAList() 
    .stream() 
    .collect(Collectors.toMap(Function.identity(), a -> getBList(a.getId())), (u, u2) -> u2); 
6

您需要Collectors.toMap

Map<A, List<B>> map = 
    x.getAList() 
    .stream() 
    .collect(Collectors.toMap (Function.identity(), a -> getBList(a.getId()))); 
+3

你比我快了30秒。 – lexicore