1、概述

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

2、什么是 Stream?

Stream(流)是一个来自数据源的元素队列并支持聚合操作
  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。

  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。

  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:
  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。

  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

3、基本操作

1)、生成流

在 Java 8 中, 集合接口有两个方法来生成流:
  • stream() − 为集合创建串行流。

  • parallelStream() − 为集合创建并行流。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

2)、中间操作

1、截断与切片
  • filter: 返回结果生成新的流中只包含满足筛选条件的数据。

Stream<T> filter(Predicate<? super T> predicate);
  • distinct:去除重复元素(通过equals和hashCode)

Stream<T> distinct();
  • limit:返回Stream流里前面的n个元素。

Stream<T> limit(long maxSize);
  • skip:和limit()相反,将前几个元素跳过(取出)再返回一个流,如果流中的元素小于或者等于n,就会返回一个空的流。

<!---->

Stream<T> skip(long n);

2、映射
  • map:将流中的元素进行再次加工形成一个新流,流中的每一个元素映射为另外的元素。

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

  • mapToLong

  • mapToDouble

  • flatMap:扁平化映射,它具体的操作是将多个stream连接成一个stream,这个操作是针对类似多维数组的,比如集合里面包含集合,相当于降维作用。

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

  • flatMapToLong

  • flatMapToDouble

3、排序
  • sorted

Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);
4、包装
  • peek:对流中每个元素执行操作,并返回一个新的流,返回的流还是包含原来流中的元素。

<!---->

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

3)、终止操作

1、查找与匹配
  • allMatch:检查是否匹配所有元素

boolean allMatch(Predicate<? super T> predicate);
  • anyMatch:检查是否至少匹配一个元素

boolean anyMatch(Predicate<? super T> predicate);
  • noneMatch:检查是否没有匹配到元素

<!---->

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

  • findFirst:返回第一个元素

Optional<T> findFirst();
  • findAny:返回当前流的任意元素

Optional<T> findAny();
  • count:返回流中元素总数

long count();
  • max:返回流中最大值

Optional<T> max(Comparator<? super T> comparator);
  • min:返回流中最小值

Optional<T> min(Comparator<? super T> comparator);
  • forEach:内部迭代

void forEach(Consumer<? super T> action);
2、规约
  • reduce

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);

3、收集

  • collect

<R, A> R collect(Collector<? super T, A, R> collector);
​
<R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner);
  • Collectors静态方法

List<T> toList()Set<T> toSet()Collection<T> toCollection
Long counting
Integer summingInt
Double averagingInt
IntSummaryStatistics summarizingInt
String joining
Optional<T> maxBy
Optional<T> minBy
...