Stream(流)是一个来自数据源的元素队列
元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
数据源 流的来源。 可以是集合,数组 等。
和以前的Collection操作不同, Stream操作还有两个基础的特征:
Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent
style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
内部迭代: 以前对集合遍历都是通过Iterator或者增强for的方式, 显式的在集合外部进行迭代, 这叫做外部迭
代。 Stream提供了内部迭代的方式,流可以直接调用遍历方法。
当使用一个流的时候,通常包括三个基本步骤:获取一个数据源(source)→ 数据转换→执行操作获取想要的结
果,每次转换原有 Stream 对象不改变,返回一个新的 Stream 对象(可以有多次转换),这就允许对其操作可以
像链条一样排列,变成一个管道。
Stream的特点:
“Stream流”其实是一个集合元素的函数模型,它并不是集合,也不是数据结构,其本身并不存储任何元素(或其地址值)。
总结就是:Stream流属于管道流,只能被消费(使用)一次
Stream流中的常用方法:
forEach:遍历的方法
void forEach(Consumer<Consumer<? suoer T>avtion>)
该方法接收一个Consrmer接口函数,会将每一个流元素交给该函数进行处理。
简单记:
forEach方法,用来遍历流中的数据
是一个终结方法,遍历后就不能继续调用Stream流中的其他方法
filter:过滤的方法
用于对Stream流中的数据进行过滤
Stream<T>filter(Predicate<? super T>predicate);
filter方法的参数Predicate是一个函数式接口,所以可以传递Lambda表达式,对数据进行过滤
Predicate中的抽象方法:
boolean test(T t)
map:转换的方法
如果需要将流中的元素映射到另一个流中,可以使用map方法。
<R>Stream<R> map(Function<? super T, ? extends R>mapper)
改接口需要一个Function函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流
Function中的抽象方法:
R apply(T t)
count:统计的方法
用于统计Stream流中元素的个数
Long count();
count方法是一个终结方法,方绘制是一个Long类型的整数
所以不要再继续调用Stream流中的其它方法了
limit:截取的方法
用于截取流中的元素
limit方法可以对流进行截取,只取用前n个。
参数是一个long型,如果集合当前长度大于参数则进行截取,否则不操作
skip:跳过的方法
如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流:
Stream<T> skip(long n);
如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流。
concat:拼接的方法
如果有两个流,希望合并成为一个流,那么可以使用Stream接口的静态方法concat
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) |
|