第一章 Stream流
Stream(流)是一个来自数据源的元素队列
元素是特点类型的对象,形成一个队列。Java中的Stream并不会存储元素。
数据源:流的来源。可以是集合,数组等。Stream操作的两个基础的特征:
Pipelining:中间操作都会返回流对象本身。(优势:延迟执行和短路)。
内部迭代:Stream提供了内部迭代的方式,流可以直接调用遍历方法。
当使用一个流的时候,通常包括三个基本步骤:获取一个数据源 -》数据转换 -》执行操作获取想要的结构。每次转换原有Stream 对象不改变,返回一个新的Stream 对象。
获取流
java.util.stream.Stream<T> 是Java 8新加入的最常用的流接口。
1. 根据Collection 获取流
java.util.Collection 接口中新加入了default 方法stream 用来获取流,所以其所有实现类均可获取流。
2. 根据Map 获取流
Map需要分key、value、entry,再获取流。
3. 根据数据获取流
如果使用的不是集合或映射而是数组,Stream 接口中提供了静态方法 of,获取流。
Stream 流的常用方法:
forEach:逐一处理。该方法接收一个Consumer 接口函数,会将每一个流元素交给该函数进行处理。(用来遍历Stream流中的数据)
void forEach(Consumer<? super T> action);
filer:过滤。可以通过filter 方法将一个流转换成另一个子集流。该接口接收一个Predicate 函数式接口参数(可以是一个Lambda或方法引用)作为筛选条件。(用于对Stream流中的数据进行过滤)
Stream<T> filter(Predicate<? super T> predicate);
map:映射。如果需要将Stream流中的元素映射到另一个流中,可以使用map方法。该接口需要一个Function 函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流。
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
count:统计个数。用于统计Stream 流中的元素个数。该方法返回一个long值代表元素个数。
long count();
limit:取用前几个。limit 方法可以对流进行截取,只取用前几个。参数是一个long型,如果集合当前长度大于参数则进行截取;否则不进行操作。
Stream<T> limit(long maxSize);
skip:跳过前几个。如果希望跳过前几个元素,可以使用skip 方法获取一个截取之后的新Stream流。如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流。
Stream<T> skip(long n);
concat:组合。如果有两个流,希望合并成为一个流,那么可以使用Stream 接口中的静态方法concat。
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b);