代码之家  ›  专栏  ›  技术社区  ›  Faraz

Java8流中间操作产生新的流?

  •  0
  • Faraz  · 技术社区  · 5 年前

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

    List<Integer> list = List.of(1,2,3,4,5);
    
    list.stream().filter(i -> i > 2).map(o -> o*2).collect(Collectors.toList());
    

    它创造了多少条小溪?1还是3?

    3 回复  |  直到 5 年前
        1
  •  3
  •   Hossein Mobasher    5 年前

    基本上,函数式编程的一个概念是 pure functions 这种确定性和没有副作用 immutability Stream api是不可变的,并返回新的流。

    如中所述 Oracle filter , map 等返回新的流。例如 地图 方法如下:

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

    这是一个中间操作。

    类型参数: 参数:

    返回: 新流

    地图 返回新的 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));
                    }
                };
            }
        };
    }
    
        2
  •  2
  •   Mureinik    5 年前

    一句话-是的。对这种方法的每次调用都会创建另一个 Stream 反对。如果分解链并在长时间内将这些中间操作分配给变量,则可以看到这一点:

    Stream<Integer> s1 = list.stream();
    System.out.println(System.identityHashCode(s1));
    Stream<Integer> s2 = s1.filter(i -> i > 2);
    System.out.println(System.identityHashCode(s2));
    Stream<Integer> s3 = s2.map(o -> o*2);
    System.out.println(System.identityHashCode(s3));
    List<Integer> result = s3.collect(Collectors.toList());
    System.out.println(result);
    

    1163157884个
    1747585824
    1149319664个

        3
  •  2
  •   Jason    5 年前

    是的,对filter和map的调用都创建一个新的 这是新的 参考管道 实现了 接口。您正在创建3个新的无状态操作对象。

    推荐文章