Java 8 lambdas-按位运算的循环转换问题?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (60)

我目前正在处理使用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

有没有更聪明/更清洁的方式来做到这一点?

提问于
用户回答回答于

不是应该是这样吗?

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

最简洁、最有效的方法是使用方法引用allMatch()

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

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

这并不能处理每个元素(它在第一个元素时返回)false),所以如果你isSuccessful()方法有副作用,它是一个不好的名称,您应该重命名它或重构代码以在process()(或类似)方法isSuccessful()返回结果,抛出IllegalStateException如果process()第一次没被打电话。

如果您不重构,一些开发人员(包括您)将调用isSuccessful()如果没有意识到它“做些事情”,这可能是不好的。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励