【问题标题】:Java 8: iterating across some Map elementsJava 8:遍历一些 Map 元素
【发布时间】:2018-07-19 14:45:45
【问题描述】:

我有一个返回booleanvalidate 方法。

我正在调用这个方法(Java 7)如下:

    boolean isValid = true;
    for (String key: aMap.keySet()) {
        isValid &= validate(key, aMap.get(key));
        if(!isValid) {
            break;
        }
    }

我想用 Java 8 重写这段代码。

Java 8 允许使用以下方法遍历 Map:

aMap.forEach((k,v) -> validate(k, v));

但这行不通:

aMap.forEach((k,v) -> isValid &= validate(k, v)); 

问题

如何将 Java 7 代码重写为 Java 8 以达到相同的结果?

注意

提出了一个类似的问题here(但这次是为了迭代继续遍历所有Map 元素)

【问题讨论】:

  • 使用 Stream.allMatch()
  • 如果短路,使用&= 操作符是没有意义的。此外,您不应该对正在迭代的每个键执行查找。因此,Java 7 代码看起来像 boolean isValid = true; for(Map.Entry<String,ValueType> e: aMap.entrySet()) if(!validate(e.getKey(), e.getValue()) { isValid = false; break; }。封装在方法中会更简单:for(Map.Entry<String,ValueType> e: aMap.entrySet()) { if(!validate(e.getKey(), e.getValue()) return false; } return true;
  • @Holger 第一个问题完全正确。我意识到了这一点并编辑了问题以添加第二个问题而不退出。对困惑感到抱歉。第二个问题的原因是:在代码的某些部分,无论isValid结果如何,都必须继续迭代,才能构建报表。如果至少一个验证失败,它仍然必须返回 true 或 false。对您的评论投了赞成票。我会提出第二个问题是另一个帖子,否则会增加混乱。

标签: loops java-8 hashmap


【解决方案1】:
boolean isValid = aMap.keySet()
                .stream()
                .allMatch(key -> validate(key, paramRow.getRowMap().get(colName))

顺便说一句,paramRow.getRowMap().get(colName) 是做什么的?你从哪里得到colName?可能你不必为每个键重新计算这个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多