流和懒惰的评估

xde*_*000 34 java java-8 java-stream

我正在阅读流抽象的java 8 API,但我不太理解这句话:

中间操作返回一个新流.他们总是懒惰; 执行诸如filter()之类的中间操作实际上并不执行任何过滤,而是创建一个新流,当遍历时,该流包含与给定谓词匹配的初始流的元素.在执行管道的终端操作之前,不会开始遍历管道源.

当过滤操作创建新流时,该流是否包含已过滤的元素?似乎理解流仅在遍历时才包含元素,即具有终端操作.但是,包含过滤流的内容是什么?我糊涂了!!!

ass*_*ias 53

这意味着过滤器仅在终端操作期间应用.想想这样的事情:

public Stream filter(Predicate p) {
    this.filter = p; // just store it, don't apply it yet
    return this; // in reality: return a new stream
}
public List collect() {
    for (Object o : stream) {
        if (filter.test(o)) list.add(o);
    }
    return list;
}
Run Code Online (Sandbox Code Playgroud)

(这不编译,是对现实的简化,但原则是存在的)


Nis*_*til 14

流是惰性的,因为除非调用终端操作,否则不评估中间操作.

每个中间操作都会创建一个新流,存储提供的操作/功能并返回新流.

管道累积这些新创建的流.

调用终端操作的时间,流的遍历开始,并且逐个执行相关的功能.

并行流不会逐个评估流(在终端点).根据可用的核心,操作是同时执行的.