gpt4 book ai didi

java - Stream.findAny 是短路操作吗?

转载 作者:搜寻专家 更新时间:2023-11-01 01:20:25 24 4
gpt4 key购买 nike

考虑这段代码

Object found = collection.stream()
.filter( s -> myPredicate1(s))
.filter( s -> myPredicate2(s))
.findAny()

它会处理整个流,并为集合中的所有元素调用 myPredicate1myPredicate2 吗?还是会调用尽可能多的谓词来实际找到值?

最佳答案

是的,因为 Stream.findAny()文档状态:

This is a short-circuiting terminal operation.

流中的对象被“推”到消费操作是一种常见的误解。实际上恰恰相反——消费操作拉取每个元素。

对于顺序流,只有找到匹配值所需的谓词才会被调用。并行流可能会执行更多谓词,但也会在找到元素后立即停止执行。

public class StreamFilterLazyTest {

static int stI = 0;

static class T {

public T() {
super();
this.i = ++stI;
}

int i;

int getI() {
System.err.println("getI: "+i);
return i;
}
}

public static void main(String[] args) {
T[] arr = {new T(), new T(), new T(), new T(), new T(), new T(), new T(), new T(), new T(), new T()};
Optional<T> found = Arrays.stream(arr).filter(t -> t.getI() == 3).findAny();
System.out.println("Found: "+found.get().getI());
}
}

将打印:

getI: 1
getI: 2
getI: 3
Found: 3

关于java - Stream.findAny 是短路操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44180155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com