Stream详解

作者: felayman | 来源:发表于2017-10-13 09:48 被阅读128次

Java 8引入了全新的Stream API。这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同.

我们先来看看Java里面是怎么定义Stream的:

A sequence of elements supporting sequential and parallel aggregate operations.

我们来解读一下上面的那句话:

Stream是元素的集合,这点让Stream看起来用些类似Iterator;
可以支持顺序和并行的对原Stream进行汇聚的操作;

Stream<T>接口继承自BaseStream<T, S extends BaseStream<T, S>>,而BaseStream接口则是Stream的基本定义接口.

BaseStream的核心接口方法:

  • Iterator<T> iterator();

    表明Stream能够进行迭代操作

  • Spliterator<T> spliterator();

    表明Stream能够进行分割迭代

  • boolean isParallel();

    判断Stream是否是并行的Stream

  • S sequential();

    获取串行的Stream

  • S parallel();

    获取并行的Stream

  • S unordered();

    获取无序的Stream

  • S onClose(Runnable closeHandler);

    返回一个同样的Stream,并同时执行一个Runnable

而Stream<T>继承了BaseStream<T, Stream<T>,则说明Stream具有BaseStream接口中所描述的方法的能力. 并且Stream对其进行了扩展,如果说BaseStream只是定义了流(Stream)具有哪些能力,则Stream接口则定义了一个具体的流能做哪些事情.

以下是Stream的的核心接口方法:

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

    在Stream中过滤符合指定条件的元素

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

    将Stream中的元素转换成另一种数据格式

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

    将Stream中的元素转换成int类型的值

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

    将Stream中的元素转换成long类型的值

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

    将Stream中的元素转换成double类型的值

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

    将stream中的元素转换成stream

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

    将stream中的元素转换成int类型的stream

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

    将stream中的元素转换成long类型的stream    
    
  • DoubleStream flatMapToDouble(Function<? super T, ? extends DoubleStream> mapper)

    将stream中的元素转换成double类型的stream

  • Stream<T> distinct()

    将Stream中重复的元素去除掉

  • Stream<T> sorted()

    对Stream中的元素进行排序

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

对Stream中的元素进行指定比较器进行排序

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

    对Stream中的元素都调用指定的方法,不影响原有元素内容

  • Stream<T> limit(long maxSize)

    限制Stream的元素内容的大小

  • Stream<T> skip(long n)

    获取跳过指定长度的Stream

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

    遍历处理Stream中的元素

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

    按照顺序遍历处理Stream中的元素

  • Object[] toArray()

    将Stream转换成对象数组

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

    将Stream 转换成指定对象的数组

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

    对Stream进行规约操作

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

    对Stream进行规约操作
    
  • <U> U reduce(U identity,
    BiFunction<U, ? super T, U> accumulator,
    BinaryOperator<U> combiner)

对Stream进行规约操作

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

    通过指定的收集器,收集Stream的内容
    
  • <R, A> R collect(Collector<? super T, A, R> collector)

    通过指定的收集器,收集Stream的内容

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

    通过指定的比较器获取元素的最小值

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

通过指定的比较器获取元素的最大值

  • long count()

获取Stream的元素内容大小

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

    判断Stream中是否含有指定要求的元素

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

    判断Stream中所有元素是否符合指定要求

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

    判断Stream中所有元素是否都不符合指定要求

  • Optional<T> findFirst()

    获取Stream中的第一个元素

  • Optional<T> findAny()

    随机获取Stream中的一个元素

  • public static<T> Builder<T> builder()

    获取一个Stream的构造器

  • public static<T> Stream<T> empty()

    获取一个空的Stream

  • public static<T> Stream<T> of(T t)

向一个Stream中添加元素

  • public static<T> Stream<T> of(T... values)

    向一个Stream中添加元素列表

  • public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)

    迭代Stream

  • public static<T> Stream<T> generate(Supplier<T> s)

    根据指定需求生成一个Stream

  • public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)

连接两个Stream成一个Stream

下面就通过具体实例来看每个方法的使用方式:

Person类:


filter(Predicate<? super T> predicate)

获取一批用户中年龄大于23的人数

System.out.println(
                Arrays.asList(
                        new Person(22,"lisi"),
                        new Person(23,"zhangsan"),
                        new Person(25,"wangwu"),
                        new Person(24,"zhouliu"),
                        new Person(27,"zhaoqi")
                        ).stream()
                        .filter(x -> x.age > 23)
                        .count()
        );

结果为:

3

相关文章

网友评论

    本文标题:Stream详解

    本文链接:https://www.haomeiwen.com/subject/hxqoyxtx.html