首页 > 编程语言 >java8新特性-引用流ReferencePipeline

java8新特性-引用流ReferencePipeline

时间:2023-03-05 15:00:19浏览次数:43  
标签:返回 mapper Stream ReferencePipeline 元素 Spliterator 引用 java8 Sink

ReferencePipeline实现了Stream接口,Stream接口定义了顺序和并行聚合的元素序列操作。

public interface Stream<T> extends BaseStream<T, Stream<T>> {

   
    Stream<T> filter(Predicate<? super T> predicate);

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

    
    IntStream mapToInt(ToIntFunction<? super T> mapper);

    
    LongStream mapToLong(ToLongFunction<? super T> mapper);

   
    DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper);

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

    
    IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);

    
    LongStream flatMapToLong(Function<? super T, ? extends LongStream> mapper);

   
    DoubleStream flatMapToDouble(Function<? super T, ? extends DoubleStream> mapper);

   
    Stream<T> distinct();

    
    Stream<T> sorted();

   
    Stream<T> sorted(Comparator<? super T> comparator);

    
    Stream<T> peek(Consumer<? super T> action);

    
    Stream<T> limit(long maxSize);

    
     
    Stream<T> skip(long n);

    
    void forEach(Consumer<? super T> action);

    
    void forEachOrdered(Consumer<? super T> action);

    
    Object[] toArray();

    
    <A> A[] toArray(IntFunction<A[]> generator);

   
    T reduce(T identity, BinaryOperator<T> accumulator);

    
     
    Optional<T> reduce(BinaryOperator<T> accumulator);

    
    <U> U reduce(U identity,
                 BiFunction<U, ? super T, U> accumulator,
                 BinaryOperator<U> combiner);

    
    <R> R collect(Supplier<R> supplier,
                  BiConsumer<R, ? super T> accumulator,
                  BiConsumer<R, R> combiner);

   
    <R, A> R collect(Collector<? super T, A, R> collector);

    
    Optional<T> min(Comparator<? super T> comparator);

    
    Optional<T> max(Comparator<? super T> comparator);

    
    long count();

   
    boolean anyMatch(Predicate<? super T> predicate);

   
    boolean allMatch(Predicate<? super T> predicate);

   
    boolean noneMatch(Predicate<? super T> predicate);

   
    Optional<T> findFirst();

   
    Optional<T> findAny();

    
    public static<T> Builder<T> builder() {
        return new Streams.StreamBuilderImpl<>();
    }

    
    public static<T> Stream<T> empty() {
        return StreamSupport.stream(Spliterators.<T>emptySpliterator(), false);
    }

   
    public static<T> Stream<T> of(T t) {
        return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
    }

    
    @SafeVarargs
    @SuppressWarnings("varargs") // Creating a stream from an array is safe
    public static<T> Stream<T> of(T... values) {
        return Arrays.stream(values);
    }

    
    public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) {
        Objects.requireNonNull(f);
        final Iterator<T> iterator = new Iterator<T>() {
            @SuppressWarnings("unchecked")
            T t = (T) Streams.NONE;

            @Override
            public boolean hasNext() {
                return true;
            }

            @Override
            public T next() {
                return t = (t == Streams.NONE) ? seed : f.apply(t);
            }
        };
        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
                iterator,
                Spliterator.ORDERED | Spliterator.IMMUTABLE), false);
    }

   
    public static<T> Stream<T> generate(Supplier<T> s) {
        Objects.requireNonNull(s);
        return StreamSupport.stream(
                new StreamSpliterators.InfiniteSupplyingSpliterator.OfRef<>(Long.MAX_VALUE, s), false);
    }

   
    public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) {
        Objects.requireNonNull(a);
        Objects.requireNonNull(b);

        @SuppressWarnings("unchecked")
        Spliterator<T> split = new Streams.ConcatSpliterator.OfRef<>(
                (Spliterator<T>) a.spliterator(), (Spliterator<T>) b.spliterator());
        Stream<T> stream = StreamSupport.stream(split, a.isParallel() || b.isParallel());
        return stream.onClose(Streams.composedClose(a, b));
    }

    
    public interface Builder<T> extends Consumer<T> {

        
        @Override
        void accept(T t);

       
        default Builder<T> add(T t) {
            accept(t);
            return this;
        }

        
        Stream<T> build();

    }
}
函数名 作用
filter(Predicate<? super T> predicate) 返回匹配断言的所有元素的Stream
map(Function<? super T, ? extends R> mapper) 返回执行函数mapper后所有元素的Stream
mapToInt(ToIntFunction<? super T> mapper) 返回执行函数mapper后所有元素的IntStream
mapToLong(ToLongFunction<? super T> mapper) 返回执行函数mapper后所有元素的LongStream
mapToDouble(ToDoubleFunction<? super T> mapper) 返回执行函数mapper后所有元素的DoubleStream
flatMap(Function<? super T, ? extends Stream<? extends R>> mapper) 返回执行函数mapper后所有元素的Stream,返回后的Stream元素类型是Stream或Stream的子类
flatMapToInt(Function<? super T, ? extends IntStream> mapper) 返回执行函数mapper后所有元素的Stream,返回后的Stream元素类型是IntStream或IntStream的子类
flatMapToLong(Function<? super T, ? extends LongStream> mapper) 返回执行函数mapper后所有元素的Stream,返回后的Stream元素类型是LongStream或LongStream的子类
flatMapToDouble(Function<? super T, ? extends DoubleStream> mapper) 返回执行函数mapper后所有元素的Stream,返回后的Stream元素类型是DoubleStream或DoubleStream的子类
distinct() 去重
sorted() 自然排序
sorted(Comparator<? super T> comparator) 按照Comparator排序
peek(Consumer<? super T> action) 对流中每个元素执行 action,执行完后流未关闭
limit(long maxSize) 返回限制maxSize个元素的Stream
skip(long n) 返回跳过n个元素的Stream
forEach(Consumer<? super T> action) 对流中每个元素执行 action,执行完后流关闭
forEachOrdered(Consumer<? super T> action) 按照顺序对流中每个元素执行 action,执行完后流关闭
toArray() 返回Object[]
toArray(IntFunction<A[]> generator) 返回A[]
reduce(T identity, BinaryOperator accumulator) 返回流中每个元素按照accumulator聚合后的结果
reduce(BinaryOperator accumulator) 返回流中每个元素按照accumulator聚合后的结果
reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator combiner) 返回流中每个元素按照accumulator和combiner聚合后的结果
collect(Collector<? super T, A, R> collector) 收集Stream中的元素
min(Comparator<? super T> comparator) 返回comparator比较器比较的最小值
max(Comparator<? super T> comparator) 返回comparator比较器比较的最大值
count() Stream中元素数量
anyMatch(Predicate<? super T> predicate) 返回Stream中是否有元素匹配断言
allMatch(Predicate<? super T> predicate) 返回Stream中是否所有元素都匹配断言
noneMatch(Predicate<? super T> predicate) 返回Stream中是否所有元素都不匹配断言
findFirst() 返回Stream中第一个元素或者空
findAny() 返回Stream中任意一个元素或者空
empty() 返回一个空的Stream
of(T t) 返回只有一个元素的顺序流
of(T... values) 返回给定元素的顺序流
iterate(final T seed, final UnaryOperator f) 返回种子, f(种子),f(f(种子))。。。等无限元素的流,f是函数操作
generate(Supplier s) 返回由s生成的无限元素顺序流
concat(Stream<? extends T> a, Stream<? extends T> b) 组合两个Stream成一个Stream

PipelineHelper是执行流操作的流水线帮助类,捕获有关流的所有信息流水线(输出形状、中间操作、流标志、并行度、等等):

abstract class PipelineHelper<P_OUT> {

   
    abstract StreamShape getSourceShape();

   
    abstract int getStreamAndOpFlags();

    
    abstract<P_IN> long exactOutputSizeIfKnown(Spliterator<P_IN> spliterator);

   
    abstract<P_IN, S extends Sink<P_OUT>> S wrapAndCopyInto(S sink, Spliterator<P_IN> spliterator);

    
    abstract<P_IN> void copyInto(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator);

    
    abstract <P_IN> void copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator);

    
    abstract<P_IN> Sink<P_IN> wrapSink(Sink<P_OUT> sink);

    
    abstract<P_IN> Spliterator<P_OUT> wrapSpliterator(Spliterator<P_IN> spliterator);

    
    abstract Node.Builder<P_OUT> makeNodeBuilder(long exactSizeIfKnown,
                                                 IntFunction<P_OUT[]> generator);

   
    abstract<P_IN> Node<P_OUT> evaluate(Spliterator<P_IN> spliterator,
                                        boolean flatten,
                                        IntFunction<P_OUT[]> generator);
}
函数名 作用
getSourceShape() 返回输入流的类型
getStreamAndOpFlags() 返回Stream操作标志
exactOutputSizeIfKnown(Spliterator<P_IN> spliterator) 返回Spliterator中元素数量,如果未知或无限则返回-1
wrapAndCopyInto(S sink, Spliterator<P_IN> spliterator) 将此PipelineHelper描述的管道阶段应用于spliterator并将结果发送给Sink
copyInto(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator) 将从Spliterator获得的元素推送到提供的Sink。如果已知流管道存在短路阶段,即StreamOpFlag#SHORT_CCIRCUIT,在每个元素检查Sink#cancelueRequested(),如果请求取消则停止。
copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator) 将从Spliterator获得的元素推送到提供的Sink,在每个元素检查Sink#cancelueRequested(),如果请求取消则停止。
wrapSink(Sink<P_OUT> sink) 获取一个 Sink,它接受PipelineHelpe,并用接受元素,并实现所有中间操作由PipelineHelper描述,将结果传递到提供的 Sink,即由wrapSink函数聚合所有的中间操作
evaluate(Spliterator<P_IN> spliterator,boolean flatten, IntFunction<P_OUT[]> generator) 收集应用管道阶段产生的所有输出元素将源Spliterator,转换为Node。

AbstractPipeline是管道类的抽象基类,这个类是核心流接口及其原语专用化的实现。管理Sink管道的操作和评估:

abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
    extends PipelineHelper<E_OUT> implements BaseStream<E_OUT, S> {
      // 到管道链头部的反向链接(如果这是源,则为自身)
     private final AbstractPipeline sourceStage;
      // “上游”管道,如果这是源阶段,则为空。
     private final AbstractPipeline previousStage;
     // 此表示的中间操作的操作标志管道对象。
      protected final int sourceOrOpFlags;
      //管道中的下一个阶段,如果这是最后一个阶段则为空。
      private AbstractPipeline nextStage;

      //此管道对象之间的中间操作数
      private int depth;
      //源和所有操作的组合源和操作标志
      private int combinedFlags;

      //源拆分器。仅对头部管道有效。
      private Spliterator<?> sourceSpliterator;
      //源 Supplier。仅对头部管道有效。
      private Supplier<? extends Spliterator<?>> sourceSupplier;
      //如果已链接或使用此管道,则为True
      private boolean linkedOrConsumed;
      //如果是并行流则返回true
      private boolean parallel;
}

标签:返回,mapper,Stream,ReferencePipeline,元素,Spliterator,引用,java8,Sink
From: https://www.cnblogs.com/shigongp/p/17180323.html

相关文章

  • Java基本数据类型和引用数据类型
    基本数据类型:byte,short,int,long,float,double,boolean,char引用数据类型:类(class),接口(interface),数组([])......
  • java8新特性-Stream基础
    Stream是跟随Lambda表达式一起发布的java8新特性。是支持串行和并行处理数据的工具。有四种类型的Stream。在StreamShape枚举中定义了Stream的类型。分别是REFERENCE(引用流......
  • 命名空间“Microsoft”中不存在类型或命名空间名“Reporting”(是否缺少程序集引用?)
    https://www.cnblogs.com/atomy/p/7618384.htmlIDE升级到VS2017之后,出现了如题所示的报错,重新引用DLL的方法如下:1、右键引用,选择添加引用。2、左侧选择浏览,下面点击浏......
  • PyCharm 中未解决的引用问题
    我有一个目录结构├──simulate.py├──src│  ├──networkAlgorithm.py│  ├──...我可以使用访问网络模块sys.path.insert()。importsy......
  • vue项目引用vue-pdf打包多出worker.js文件
    问题描述:项目要用到pdf预览功能,因为是vue项目就是直接导入了vue-pdf组件,但是在进行打包的时候在dist文件夹下面多个worker.js文件,导致项目部署后预览pdf直接报了404 方......
  • Java8中Stream详细用法大全
    Java8中Stream详细用法大全一、概述Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操......
  • Arrays, Lambda、方法引用、算法
    1,Arrays类1,Arrays基本使用Arrays是操作数组的工具类,它可以很方便的对数组中的元素进行遍历、拷贝、排序等操作。Arrays中常见的方法(很不全,只是为了引出Lambda):方法名......
  • 踩坑小计-Flutter中引用其他module的asset资源
    最近开发了一个module,其中使用了asset设置了一个图片资源,在调试module时一切正常,当把module作为一个模块依赖到其他项目时,就出现了如下错误:查了一下解决方案,在使用asset时......
  • 引用isalnum()函数判断是否为字母或数字
    #include<stdio.h>#include<ctype.h>intmain(){charch;printf("inputacharacter:");//输入一个字符scanf_s("%c",&ch);if(isalnum(ch))//......
  • 模板引用 ref
    虽然Vue的声明性渲染模型为你抽象了大部分对DOM的直接操作,但在某些情况下,我们仍然需要直接访问底层DOM元素。要实现这一点,我们可以使用特殊的 ref attribute:访问......