Java 8 : 映射 Lambda 表达式
Java 8 : Map Lambda expression
我有一个 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;
}
想知道这个方法是否可以进一步简化?
您确实可以使用流来简化内部循环。
您可以替换:
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 的回答以获得 "full stream" 解决方案。
您可以使用流 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());
你可以这样简化它:
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
及其通用签名了……
我有一个 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;
}
想知道这个方法是否可以进一步简化?
您确实可以使用流来简化内部循环。
您可以替换:
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 的回答以获得 "full stream" 解决方案。
您可以使用流 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());
你可以这样简化它:
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
及其通用签名了……