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)
如果您可以使用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)