stream流的认识
一、什么叫流
-
Stream流只会对流数据进行处理并不会保存。流不存储元素。它只是通过计算操作管道(或者从计算机的消息队列中)从数据结构、数组或 I/O 通道等源传输元素。
-
Stream流只会接收数据进行处理,并不会改变源数据。流本质上是功能性的
-
Stream流并不会主动去寻找数据,如果没有数据流他就停在那里等待,我们叫他惰性,仅在需要时对流进行计算。流是惰性的
-
Stream流也支持并行处理,如果需要的话,Stream流可以充分利用计算机资源并行处理这段数据。流具有并行处理的能力
-
Stream流只是一次性的,就像迭代器一样,当对流的处理结束,他将不能再执行一遍。在流的生命周期中,流的元素仅访问一次。
二、流的目的
用于简化集合和数组的操作。
三、流的使用
List<String> list = new ArrayList<>();
list.add("张三");
list.add("张三丰");
list.add("柳岩");
list.add("林青霞");
list.add("张曼玉");
//普通写法
//找出“张”开头的人物
list.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.startsWith("张");
}
}).forEach(s -> System.out.println(s));
//简化写法
//找出“张”开头的人物,并且长度为3的人物
list.stream().filter(s->s.startsWith("a")).filter(s->s.length()==3).forEach(System.out::println);
1. 流的使用流程
数据源(source) -> 数据处理 / 转换(intermedia) -> 结果处理(terminal)
2. Stream的核心思想:
- 先得到集合或者数组的Stream流对象。
- 把元素放进去
- 然后用Stream流简化的API来操作元素
四、流的常用方法
1. 获取Stream流
如果是数组的话,可以使用 Arrays.stream() 或者 Stream.of() 创建流;如果是集合的话,可以直接使用 stream() 方法创建流,因为该方法已经添加到 Collection 接口中。
- Collection接口中的方法
方法 | 说明 |
---|---|
default Stream |
返回以此集合为源的顺序 Stream |
- 通过数组获取方式,使用Arrays工具类中提供的方法
方法 | 说明 |
---|---|
public static |
返回以指定数组作为源的顺序 Stream |
public static |
返回以指定数组,指定索引范围作为源的顺序 Stream |
static |
返回包含单个元素的Stream |
static |
返回其元素为指定值的顺序Stream |
2. 操作流
方法 | 说明 |
---|---|
Stream |
返回由与此给定谓词匹配的此流的元素组成的流 |
Stream |
返回由此流的元素组成的流,截断长度不超 过 maxSize |
Stream |
在丢弃流的第一个 n 元素后,返回由此流 的其余元素组成的流 |
Stream |
返回由此流的不同元素(根据 Object.equals(Object) )组成的流 |
static |
创建一个延迟连接的流,其元素是第一个流 的所有元素,后跟第二个流的所有元素 |
3. 终结方法
方法 | 说明 |
---|---|
void forEach(Consumer<? super T> action) | 对此流的每个元素执行操作 |
long count() | 返回此流中元素的数量 |