将元素列表的列表转换为Map <K,List <V >>

Ami*_*mit 3 java list java-8 java-stream

我有以下结构.

Request {
    List<Param> paramList;
    Date startDate;
    Date endDate;
}

Param {
    String paramId;
    List<DataParam> dataParams; 
}

DataParam {
    String dataId;
    List<String> values;
}

CustomRequest {
    List<NewDataParam> newDataParam;
    Date startDate;
    Date endDate;
}

NewDataParam {
 String paramId;
 String dataId;
----
}
Run Code Online (Sandbox Code Playgroud)

用paramList迭代请求,我想制作paramId的地图和生成的请求Map<String, List<CustomRequest>>.

用下面的代码,我得到了Map<String, List<List<CustomRequest>>>.有人可以建议如何获得Map<String, List<CustomRequest>>.

request.paramList().stream()
    .collect(Collectors.groupingBy(Param::getParamId, 
        Collectors.mapping(i -> i.dataParams().stream()
           .map(r -> customBuildMethod(i.dataParamId(), r, request)).collect(Collectors.toList()), Collectors.toList())));

private CustomRequest customBuildMethod(String paramId ...) {
    CustomRequest customRequest = new CustomRequest();
    //mapping
    return customRequest;
}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 5

如果您可以使用Java 9,则可以使用Collectors.flatMapping实现您的目标:

request.paramList()
       .stream()
       .collect(Collectors.groupingBy(Param::getParamId, 
                                      Collectors.flatMapping(i -> i.dataParams().stream().map(r -> customBuildMethod(i.dataParamId(), r, request))), 
                                                            Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

在Java 8中,您可以执行以下操作:

Map<String, List<CustomRequest>> result = 
    request.paramList()
          .stream()
          .collect(Collectors.groupingBy(Param::getParamId, 
                                         Collector.of(ArrayList::new, 
                                                     (l,i)->l.addAll(i.dataParams().stream().map(r -> customBuildMethod(i.dataParamId(), r, request)).collect(Collectors.toList())),
                                                     (l1,l2)->{l1.addAll(l2);return l1;})));
Run Code Online (Sandbox Code Playgroud)