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 及其通用签名了……