Java 8:映射Lambda表达式

时间:2015-04-27 06:21:08

标签: java collections lambda java-8

我有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 个答案:

答案 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及其通用签名...