Stream Api
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
...
- 感谢你赐予我前进的力量