java:reduce vs anyMatch vs contains

时间:2019-04-05 00:05:02

标签: java java-8 java-stream

 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

是否有使用两者的利弊?

3 个答案:

答案 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 之后最终会变成假。