Java 8 Java 8 Stream anyMatch()贯穿整个流

Java 8 Java 8 Stream anyMatch()贯穿整个流,java-8,java-stream,Java 8,Java Stream,考虑到这样的三个功能: private Optional<Integer> abc() { return Optional.of(6); } private Optional<Integer> def() { return Optional.of(3); } private Optional<Integer> ghi() { return Optional.of(9); } if( abc().get() > 5 ||

考虑到这样的三个功能:

private Optional<Integer> abc() {
    return Optional.of(6);
}


private Optional<Integer> def() {
    return Optional.of(3);
}


private Optional<Integer> ghi() {
    return Optional.of(9);
}
if( abc().get() > 5 || def().get() > 5 || ghi().get() > 5) {
  ......// Do something
 }  // I am not doing get() without checking ifPresent() just for simplicity sake
这将只进入函数
abc()
并跳过
def()
ghi()
,因为第一个表达式返回true。这是一个很好的优化。 现在,如果我使用流以函数形式编写相同的代码

if( Stream.of(abc(), def(), ghi()).anyMatch(integer -> integer.get() > 5)) {
   .........
}
我认为同样的情况也会发生,即只调用
abc()
。但它调用了所有三个函数。如果存在
anyMatch()
,检查其他两个函数不是多余的吗


noneMatch()
的情况下也是如此;水流穿过整条小溪。我只是想知道:遍历整个流(特别是如果流有很多值),即使在第一个元素满足条件,这难道不是一件坏事吗?

这是因为
流的
流的anyMatch
,所以所有的方法都被调用,因为它们发生在
流的
之前

您可以使用
Supplier
在实际方法调用之前进行
Stream#anyMatch
,例如:

// Note: it just create Suppliers and actual method is called on demand 
Stream<Supplier<Optional<Integer>>> values=Stream.of(this::abc,this::def,this::ghi);

if(values.anyMatch(integer -> integer.get().get() > 5)) {
    .........
}
Supplier<Optional<Integer>> failsOnMismatched = () -> { 
   throw new IllegalStateException(); 
};

// the instantiation of method reference happen before `Stream#of`,
// but the linked method is called on demand.
//                 v 
if(Stream.of(this::abc, failsOnMismatched).anyMatch(it -> it.get().orElse(0) > 5)){
  //reached
}

//it is failed since the value of def() <= 5 ---v
if(Stream.of(this::def, failsOnMismatched).anyMatch(it -> it.get().orElse(0) > 5)){
  //unreachable
}
不能为谓词中的所有特定元素求值。但是,同时
也需要参数,这意味着将首先对它们求值

返回此流的任何元素是否与提供的 谓词<如果不是,strong>可能不会对所有元素计算谓词 确定结果所必需的。如果流是空的,那么 返回false,并且不计算谓词


如果您使用Java 9或更高版本,您可以链接选项、应用和:


请注意,此解决方案是完整的,也就是说,您不需要检查是否存在任何值,因为这已经由
Optional.filter
Optional.or
Optional.ifPresent

执行
Stream.of(abc()、def()、ghi())
完成,您正在调用3种方法related:Thank@Holger。等待使用Java9:D
abc().filter(n -> n > 5)
    .or(() -> def().filter(n -> n > 5))
    .or(() -> ghi().filter(n -> n > 5))
    .ifPresent(n -> {
        // do domething
    });