Java 8:Map Lambda表达式

7

我有一个 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;
}

我想知道这种方法能否进一步简化?

3个回答

6

您可以使用流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());

5
个人认为,在这种情况下,使用完整流解决方案往往比“老派”的foreach循环不易阅读。 :p - fge

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 的答案,提供了一种“完整流”解决方案。

1
代码简化并不总是需要使用 Stream API... - Holger

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接