Stream详解

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接口继承自BaseStream>,而BaseStream接口则是Stream的基本定义接口.

BaseStream的核心接口方法:

  • Iterator iterator();

    表明Stream能够进行迭代操作

  • Spliterator spliterator();

    表明Stream能够进行分割迭代

  • boolean isParallel();

    判断Stream是否是并行的Stream

  • S sequential();

    获取串行的Stream

  • S parallel();

    获取并行的Stream

  • S unordered();

    获取无序的Stream

  • S onClose(Runnable closeHandler);

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

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

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

  • Stream filter(Predicate predicate)

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

  • Stream map(Function mapper)

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

  • IntStream mapToInt(ToIntFunction mapper)

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

  • LongStream mapToLong(ToLongFunction mapper)

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

  • DoubleStream mapToDouble(ToDoubleFunction mapper)

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

  • Stream flatMap(Function> mapper)

    将stream中的元素转换成stream

  • IntStream flatMapToInt(Function mapper)

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

  • LongStream flatMapToLong(Function mapper)

    将stream中的元素转换成long类型的stream    
    
  • DoubleStream flatMapToDouble(Function mapper)

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

  • Stream distinct()

    将Stream中重复的元素去除掉

  • Stream sorted()

    对Stream中的元素进行排序

  • Stream sorted(Comparator comparator)

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

对Stream进行规约操作

  • R collect(Supplier supplier,
    BiConsumer accumulator,
    BiConsumer combiner)

    通过指定的收集器,收集Stream的内容
    
  • R collect(Collector collector)

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

  • Optional min(Comparator comparator)

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

  • Optional max(Comparator comparator)

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

  • long count()

获取Stream的元素内容大小

  • boolean anyMatch(Predicate predicate)

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

  • boolean allMatch(Predicate predicate)

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

  • boolean noneMatch(Predicate predicate)

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

  • Optional findFirst()

    获取Stream中的第一个元素

  • Optional findAny()

    随机获取Stream中的一个元素

  • public static Builder builder()

    获取一个Stream的构造器

  • public static Stream empty()

    获取一个空的Stream

  • public static Stream of(T t)

向一个Stream中添加元素

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

    向一个Stream中添加元素列表

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

    迭代Stream

  • public static Stream generate(Supplier s)

    根据指定需求生成一个Stream

  • public static Stream concat(Stream a, Stream b)

连接两个Stream成一个Stream

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

Person类:


filter(Predicate 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详解)