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 peek(Consumer action)
    对Stream中的元素都调用指定的方法,不影响原有元素内容
  • Stream limit(long maxSize)
    限制Stream的元素内容的大小
  • Stream skip(long n)
    获取跳过指定长度的Stream
  • void forEach(Consumer action)
    遍历处理Stream中的元素
  • void forEachOrdered(Consumer action)
    按照顺序遍历处理Stream中的元素
  • Object[] toArray()
    将Stream转换成对象数组
  • A[] toArray(IntFunction generator)
    将Stream 转换成指定对象的数组
  • T reduce(T identity, BinaryOperator accumulator)
    对Stream进行规约操作
  • Optional reduce(BinaryOperator accumulator)
    对Stream进行规约操作

  • U reduce(U identity,
    BiFunction accumulator,
    BinaryOperator combiner)
对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详解】向一个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

    推荐阅读