java - 查找流中的哪个元素与 allmatch 中的给定谓词不匹配

标签 java java-8 java-stream

allmatch 的情况下,我想找出哪个元素使谓词失败。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean isEven = numbers.stream().allMatch(n-> n % 2 == 0);

此处 isEvenfalse,因为元素 1 未通过谓词。

我可以在流上使用 forEach 来查找哪个元素失败,例如:

numbers.stream().forEach(n -> {
            if (n % 2 != 0)
                System.out.println(n + "is Odd");
        });

有没有办法在 allmatch 返回 false 时找出哪些元素不符合谓词?

最佳答案

请记住,allMatch 是一个短路操作,这意味着流 API 可能会在没有找到所有未通过测试的元素的情况下返回 false。

因此,如果您想找到所有 失败的元素,您可能需要做比简单的allMatch(如其他答案所示)更多的工作。但是,如果您只想找到一个未通过测试的元素,请按如下方式使用 findAny:

Optional<Integer> odd = numbers.stream()
    .filter(n -> n % 2 != 0)
    .findAny();

boolean isEven = !odd.isPresent();

odd.ifPresent(x -> System.out.println(x + " is odd"));

关于java - 查找流中的哪个元素与 allmatch 中的给定谓词不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44428715/

相关文章:

java - 使用 jOOQ 强制 boolean 类型抛出 NPE

java - 使用 TextIO 运行程序时出现程序异常

sorting - 合并和排序多个流 java 8

java - 使用生成器函数创建有限流

java - 使用 java8 流将 Map<Integer, List<Integer>> 转换为 List<Integer>

java - 用于 Web 应用程序的 JPF(Java 路径查找器)

java - 如何使用流从两个列表或数组乘法中查找元素对

java - 并行流中 I/O 代码的 SecurityException

java - 如何打开 List<Map>,按 Map 键分组并按 Map 值缩减

java - 如何使 Object.class 类型成为泛型