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));
输出:
错误
错误
假
仅供参考,结果是map + collect op
的结果List<Job> jobs;
List<Boolean> results = job.stream().map(j -> j.ready()).collect(Collector.toList())
如果选择reduce或anyMatch,则不必从map操作中收集结果。
从结果(是一个布尔值列表)中,如果至少存在一个false,我只想返回false。
我可以通过reduce或anyMatch做到这一点。我有点不喜欢reduce中的Optional,也有点不喜欢否定anyMatch
是否有使用两者的利弊?
答案 0 :(得分:6)
您似乎将布尔值收集到列表中的唯一原因是可以检查是否有一些false
:
如果我选择reduce或anyMatch,则不必从map操作中收集结果[...]如果至少存在一个false,我只想返回false。
如果是这种情况,那么您绝对应该考虑基于流的简单方法:
return jobs.stream().allMatch(Job::ready);
答案 1 :(得分:1)
您询问利弊。 Contains
是最快,最简单的。 Reduce
在这里最麻烦/最复杂。但是您的任务非常简单,真的重要吗?选择使用哪种方法的更好的关键可能是:“哪种方法更具可读性,可理解性和可维护性?”在实际的软件开发中,这种干净的代码方法通常比运行时或源代码中的行数搜寻微秒重要。但是话又说回来,contains
是最好的。
System.out.println(!results.contains(false));
然后,您的anyMatch(a -> !a)
实际上与contains
相同,相对于reduce
,在此具体任务上,我肯定会更喜欢它。但同样,实际差异很小,我将更关注此软件的未来维护者的可读性和可理解性。
答案 2 :(得分:0)
System.out.println(results.stream().reduce((a, b) -> a && b).get());
这将始终返回false,因为列表(results
)至少具有1个false
。
&& 将始终检查两个值是否都为true,以将其作为true
传递。
System.out.println(!results.stream().anyMatch(a -> !a));
流anyMatch(Predicate predicate)
返回此流的任何元素(结果)是否与提供的谓词 (a -> !a)
相匹配。当您执行!results
时,结果在最初 true 之后最终会变成假。