在Java中将筛选器应用于流

在Java中将筛选器应用于流,java,filter,java-8,java-stream,predicate,Java,Filter,Java 8,Java Stream,Predicate,给定以下代码,我希望输出为“-3-2-101231”,因为过滤器应该遍历流的所有项,从而打印正在计算的项。当计算allMatch函数时,它应该打印“1”,因为它正在接收一个正整数流,因此在发现第一个元素不是负的之后,它应该短路 为什么打印“-3-2-1011”而不是“-3-2-101231” List List=Arrays.asList(-3,-2,-1,0,1,2,3); 谓词正=i->{ 系统输出打印(一); 返回i>0; }; 谓词负=i->{ 系统输出打印(一); 返回iNo,筛选器不

给定以下代码,我希望输出为“-3-2-101231”,因为过滤器应该遍历流的所有项,从而打印正在计算的项。当计算allMatch函数时,它应该打印“1”,因为它正在接收一个正整数流,因此在发现第一个元素不是负的之后,它应该短路

为什么打印“-3-2-1011”而不是“-3-2-101231”

List List=Arrays.asList(-3,-2,-1,0,1,2,3);
谓词正=i->{
系统输出打印(一);
返回i>0;
};
谓词负=i->{
系统输出打印(一);
返回iNo,筛选器不应该遍历流中的每个项。这将是一种浪费。只要
allMatch()
操作看到一个非负项,管道就会终止

不能保证流中的所有项都将被过滤;保证由
allMatch()
测试的任何项都已首先通过前面的过滤器

您看到的输出是来自筛选器的-3-2-1 0 1,然后是来自终止进程的最终谓词的1。当终端操作已经确定其结果时,不需要从上游筛选器操作获取2

用文档的话来说,

-惰性搜索。许多流操作(如筛选、映射或重复删除)可以惰性地执行,从而提供优化机会。例如,“查找具有三个连续元音的第一个字符串”不需要检查所有输入字符串。流操作分为中间(流生成)操作和终端(产生价值或副作用)操作。中间操作总是惰性的

以及

惰性处理流可以显著提高效率;在上面的过滤器映射和示例这样的管道中,过滤、映射和求和可以融合到数据的一次传递中,中间状态最小。惰性还可以避免在不必要时检查所有数据;对于“查找长度超过1000个字符的第一个字符串”,只需检查足够多的字符串即可找到具有所需特征的字符串,而无需检查源中所有可用的字符串。(当输入流无限大而不仅仅是很大时,此行为变得更为重要。)


对于“1”,该值为false。而false&&(任何其他值)将始终为false,因此它不会计算任何其他值

与true和false的if语句类似,它执行惰性计算:

public static void main(String[] args){
    System.out.println("Test1: False && anything else:");
    if (returnFalse() && returnTrue()) {

    }

    System.out.println("Test2: False || anything else:");
    if (returnFalse() || returnTrue()) {

    }
    System.out.println("Test3: True || anything else:");
    if (returnTrue() || returnTrue()) {

    }
    System.out.println("Test4: True && anything else:");
    if (returnTrue() && returnTrue()) {

    }


}
public static boolean returnFalse() {
    System.out.println("false");
    return false;
}

public static boolean returnTrue() {
    System.out.println("true");
    return true;
}
其结果将是:

Test1: False && anything else:
false
Test2: False || anything else:
false
true
Test3: True || anything else:
true
Test4: True && anything else:
true
true

使用此-
list.stream().filter(正数).allMatch(负数);
?从您的问题来看,您希望输出为“-3-2-101231”,与给定列表中的所有值相同。明确的要求是什么?
Test1: False && anything else:
false
Test2: False || anything else:
false
true
Test3: True || anything else:
true
Test4: True && anything else:
true
true