【发布时间】:2017-02-16 12:11:15
【问题描述】:
我目前正在处理使用 Java 8 中的 Lambda 转换使用按位运算的 for 循环的问题。
给定一组复杂的条目,循环需要遍历所有条目并在它们上调用给定的方法(方法返回布尔值)。然后返回结果。
换句话说,我需要在所有条目上调用该方法并存储结果。 这背后的原因是每个条目独立执行复杂的操作,必须执行。最终结果是结果的组合。
代码sn-p:
boolean areAllSuccessful = true;
for (SomeEntry entry : entries) {
areAllSuccessful = areAllSuccessful & entry.doComplexAction(); // keep calling the method on other entries regardless of the result.
}
return areAllSuccessful;
问题在于 Java 8 中的 Lambda 函数通常会执行短路操作(一旦检测到错误条目,“循环”就会中断并返回错误结果)。
到目前为止,我最好的解决方案是使用 map/filter/count 组合:
return entries
.stream()
.map(entry -> entry.doComplexAction())
.filter(result -> result == false)
.count() > 0
有没有更聪明/更清洁的方法?
谢谢!
【问题讨论】:
-
我认为您的用例更适合传统的
for循环而不是流。真的,试图让一切都基于流并不是要走的路。如果它按原样工作,那么就这样吧。 -
只是评论:
isSuccessful()是一个非常糟糕的名字,因为它具有副作用,会进行大量操作。您应该 1)在问题中明确该方法具有副作用,因此需要在每个条目上调用,以及 2)将该方法重命名为doComplexActions()之类的名称。 -
如果您需要流,请不要使用副作用 XOR 如果您需要副作用,请不要使用流。其他一切都只是自找麻烦。
-
被调用的方法有副作用,应该写得更显眼(粗体,闪烁,在标题中等等;-))。
-
不要使用按位运算以避免短路。您可以轻松颠倒顺序 (
entry.isSuccessful() && areAllSuccessful) 来强制执行该方法。不要用螺丝刀敲钉子。你只会让所有人感到困惑。此外,不要在行尾放置长注释,因为它会离开屏幕并且开发人员不会阅读它。将它放在它注释的行之前的自己的行中。
标签: java for-loop lambda java-8 bitwise-operators