我目前正在解决在Java 8中使用Lambda转换位运算的for循环问题。
给定一组复杂的条目,需要循环遍历所有条目并调用给定方法(该方法返回布尔值)。之后返回结果。
换句话说,我需要在所有条目上调用该方法并存储结果。 其原因是每个条目独立执行复杂操作,必须执行。 最终结果是一系列结果的组合。
代码片段:
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
有没有更聪明/更清洁的方法来做这件事?
谢谢!
isSuccessful()
是一个带有副作用且执行许多操作的方法,这是一个非常糟糕的名称。你应该1)在问题中明确指出该方法具有副作用,因此需要在每个条目上调用;2)将该方法重命名为doComplexActions()
等更合适的名称。 - walenentry.isSuccessful() && areAllSuccessful
)来强制执行方法。不要用螺丝刀敲钉子,这只会让大家困惑。此外,不要在超出屏幕并且开发人员无法阅读的行末添加长注释。请将其放在所注释的行之前的单独一行上。 - jpmc26