Java 8 Lambdas - 按位 AND 操作

我目前正在解决在Java 8中使用Lambdas使用按位运算的循环转换问题。

给定一组复杂条目,循环需要遍历所有条目并对其调用给定的方法(方法返回布尔值)。之后,返回结果。

换句话说,我需要在所有条目上调用该方法并存储结果。这背后的原因是每个条目独立执行复杂的操作,必须执行。最终结果是结果的组合。

代码片段:

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

有没有更聪明/更清洁的方法可以做到这一点?

谢谢!


答案 1

这不应该看起来像这样吗:

boolean areAllSuccessful = entries.stream()
   .map(entry -> entry.isSuccessful())
   .reduce(Boolean.TRUE, Boolean::logicalAnd);

答案 2

最整洁,最有效的方法是使用方法引用allMatch()

return entries.stream().allMatch(SomeEntry::isSuccessful);

如果您有 1000 个元素,请考虑改用。parallelStream()

这不会处理每个元素(它在第一个元素返回),所以如果你的方法有副作用,这是一个坏名称,你应该重命名它或重构代码以在(或类似)方法中执行副作用并返回结果,抛出一个没有首先调用的if。falseisSuccessful()process()isSuccessful()IllegalStateExceptionprocess()

如果你不重构,一些开发人员(包括你)会在没有意识到它“做事情”的情况下打电话,这可能是不好的。isSuccessful()