【发布时间】:2018-07-19 14:45:45
【问题描述】:
我有一个返回boolean 的validate 方法。
我正在调用这个方法(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。对您的评论投了赞成票。我会提出第二个问题是另一个帖子,否则会增加混乱。