首页 > 解决方案 > Java 8 Streams 中间操作产生新的流?

问题描述

当我在流上调用中间操作时,它们是否为每个中间操作创建新流?

List<Integer> list = List.of(1,2,3,4,5);

list.stream().filter(i -> i > 4).map(o -> o*2).collect(Collectors.toList());

它创建了多少流?1 还是 3?

标签: javajava-stream

解决方案


基本上,函数式编程的概念之一是pure functions确定性且无副作用,称为immutability. api 中的所有中间操作Stream都是不可变的,并返回新的 Stream。

正如Oracle文档中提到的,所有的中间操作,比如filtermap等等都会返回新的流。例如map方法文档如下:

Stream<R> map(Function<? super T,? extends R> mapper)

返回由将给定函数应用于此流的元素的结果组成的流。这是一个中间操作。

类型参数: R - 新流的元素类型参数:

mapper - 适用于每个元素的无干扰、无状态函数

返回: 新流

有关更多信息,您可以查看 Java 中的 Stream 实现(例如map返回 new 的方法StatelessOp

public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper) {
    Objects.requireNonNull(mapper);
    return new StatelessOp<P_OUT, R>(this, StreamShape.REFERENCE,
                                 StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
        @Override
        Sink<P_OUT> opWrapSink(int flags, Sink<R> sink) {
            return new Sink.ChainedReference<P_OUT, R>(sink) {
                @Override
                public void accept(P_OUT u) {
                    downstream.accept(mapper.apply(u));
                }
            };
        }
    };
}

推荐阅读