有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java8:流。筛选器未按预期运行

鉴于:

    List<String> str = Arrays.asList ("my", "pen", "is", "your", "pen");
    Predicate<String> test = s -> {
        int i = 0;
        boolean result = s.contains ("pen");
        System.out.print((i++) + ":");
        return result;
    };

这个打印:0:0:

    str.stream().filter(test).findFirst();

这张照片是0:0:0:0:0:

    str.stream().filter(test).collect(Collectors.toList());

让我困惑的是,无论是findFirst还是collect,无论终端操作是短路,它们都应该遍历列表中的每个项目,对吗

那么,在第一个示例findFirst中,为什么“0:”会被打印两次,而不仅仅是一次,而不是五次


共 (2) 个答案

  1. # 1 楼答案

    What confuses me is, no matter it is findFirst or collect, no matter the terminal operation is short-circuiting or not, they both should iterate through each item in the list, right?

    在不检查整个流的情况下返回的能力正是导致操作(如findFirst)短路的原因。见Streams javadoc

    Streams文档实际上没有承诺如何或是否对谓词求值。它只保证返回与谓词匹配的流的第一个元素

  2. # 2 楼答案

    第一个流的思想是迭代以找到“pen”的第一个匹配项,因此谓词迭代数组,直到找到与过滤器条件匹配的第一个元素。因此,您只能看到两个“0:”Official documentation