【问题标题】:Java 8 : Map Lambda expressionJava 8:映射 Lambda 表达式
【发布时间】:2015-07-05 11:32:37
【问题描述】:

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

想知道这个方法可以进一步简化吗?

【问题讨论】:

    标签: java collections lambda java-8


    【解决方案1】:

    您确实可以使用流来简化您的内部循环。

    你可以替换:

    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 的“完整流”解决方案答案。

    【讨论】:

    • 代码简化并不总是需要Stream API 使用...
    【解决方案2】:

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

    【讨论】:

    • 这通常是我个人认为完整的流解决方案实际上比“旧的” foreach 循环可读性差的情况:p
    【解决方案3】:

    你可以这样简化:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多