List<Boolean> results = new ArrayList<>();
results.add(true);
results.add(true);
results.add(true);
results.add(false);
if (results.contains(false)) {
System.out.println(false);
} else {
System.out.println(true);
}
System.out.println(results.stream().reduce((a, b) -> a && b).get());
//System.out.println(!results.stream().anyMatch(a -> a == false));
System.out.println(!results.stream().anyMatch(a -> !a));
输出:
false
false
false
仅供参考,结果是地图收集操作的结果
List<Job> jobs;
List<Boolean> results = job.stream().map(j -> j.ready()).collect(Collector.toList())
如果我选择reduce或anyMatch,我就不必从map操作中收集结果。
从布尔值列表的结果中,如果至少有一个false,我只想返回false。
我可以通过reduce或anyMatch来实现。我有点不喜欢reduce中的可选项,我也有点不喜欢我必须否定任何匹配项
使用这两种方法有什么优点/缺点吗?
System.out.println(results.stream().reduce((a, b) -> a && b).get());
这将始终返回false,因为列表(结果
)至少有1个false
。
System.out.println(!results.stream().anyMatch(a -> !a));
StreamanyMatch(谓词谓词)
返回此流(结果)的任何元素是否与提供的谓词匹配(a-
你问利弊。包含
是最快和最简单的。减少
在这里是最麻烦/复杂的。但是你的任务非常简单,所以这真的很重要吗?也许选择使用哪种方法的更好的关键是:“哪种方法更容易阅读、理解和维护?”在实际的软件开发中,这种干净的代码方法通常比在运行时寻找微秒或源代码中的行数更重要。但是话说回来,我想说包含
在这里是最好的。
System.out.println(!results.contains(false));
然后你的anyMatch(a-
看起来,将布尔值收集到列表中的唯一原因是,您可以检查其中是否有false
:
如果我选择reduce或anyMatch,我不必从映射操作中收集结果[…]如果至少有一个false,我只想返回false。
如果是这样的话,那么您绝对应该考虑直接的基于流的方法:
return jobs.stream().allMatch(Job::ready);