我有Map<String, List<Object>> multiFieldMap
,我需要迭代其值集并将值添加到multiFieldsList
,如下所示
public List<Object> fetchMultiFieldsList() {
List<Object> multiFieldsList = new ArrayList<Object>();
for (Entry<String, List<Object>> entry : multiFieldMap.entrySet()) {
String entityName = entry.getKey();
List<Object> ids = entry.getValue();
for (Object id : ids) {
Object entity = queryService.query(entityName, queryService.property("id").eq(id));
multiFieldsList.add(entity);
}
}
return multiFieldsList;
}
我想知道这种方法可以进一步简化吗?
答案 0 :(得分:5)
您可以使用Streams API:
List<Object> multiFieldsList =
multiFieldMap.entrySet()
.stream()
.flatMap(e -> e.getValue()
.stream()
.map(o -> queryService.query(e.getKey(), queryService.property("id").eq(o))))
.collect(Collectors.toList());
答案 1 :(得分:2)
您确实可以使用流来简化内循环。
您可以替换:
List<Object> ids = entry.getValue();
for (Object id : ids) {
Object entity = queryService.query(entityName, queryService.property("id").eq(id));
multiFieldsList.add(entity);
}
使用:
entry.getValue().map(
id -> queryService.query(entityName, queryService.property("id").eq(id))
).forEach(multiFieldsList::add);
但是你并没有从中获得太多收益。你的选择......
请参阅@ Eran的答案,了解&#34;完整信息流&#34;溶液
答案 2 :(得分:2)
您可以像这样简化:
public List<Object> fetchMultiFieldsList() {
List<Object> multiFieldsList = new ArrayList<>();
multiFieldMap.forEach( (entityName, ids ) ->
ids.forEach( id -> multiFieldsList.add(
queryService.query(entityName, queryService.property("id").eq(id)))
)
);
return multiFieldsList;
}
除非您想使用Stream
API,否则方法Map.forEach
可能是代码简化的最大胜利,因为您不再需要处理Map.Entry
及其通用签名...