【问题标题】:Java 8 streams and lambdasJava 8 流和 lambda
【发布时间】:2018-08-18 02:15:27
【问题描述】:

我有一段非常有趣的代码要重构以使用 java 8 流 API 功能

Map<String, Object> user = ...// pull user from somewhere
List<Map<String, Object>> attributes = ...// pull attributes from somewhere
List<Map<String, Object>> processedAttributes = new ArrayList<>();
    for (Map<String, Object> attribute : attributes) {
        if (!((List<Map<String, Object>>) attribute.get("subAttributes")).isEmpty()) {
            for (Map<String, Object> subAttribute : (List<Map<String, Object>>) attribute.get("subAttributes")) {
                if (!user.containsKey(subAttribute.get("name"))
                        && Boolean.TRUE.equals(subAttribute.get("required"))) {
                    processedAttributes.add(subAttribute);
                }
            }
        }
    }

如何使用 java 8 流对其进行重构?

【问题讨论】:

  • for (iterable) 替换为iterable.forEach(x -&gt; statement),将if 替换为iterable.filter(x -&gt; condition)。看看那个循环,语句会很长。
  • 你也可以使用mapfilter(List::isEmpty)
  • 有趣的问题。您认为您可以阅读一下Stream API 并提出解决方案吗?如果您卡在某个地方,我们可以帮助您吗?或者这是一个编码请求?

标签: java lambda java-8 java-stream


【解决方案1】:

这可以使用flatMap 以非常简单的方式重写:

List<Map<String, Object>> processedAttributes = attributes.stream()
        .flatMap(
                attribute -> ((List<Map<String, Object>>) attribute
                        .get("subAttributes")).stream())
        .filter(subAttr -> !user.containsKey(subAttr.get("name"))
                && Boolean.TRUE.equals(subAttr.get("required")))
        .collect(Collectors.toList());

注意isEmpty 在你的代码中检查是不必要的:如果List 是空的,那么for 循环将不会被执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2014-05-04
    • 2019-06-04
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多