Stream流
概念:生产流水线
特点:
- 流是一个接口
- 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
- 数据源流的来源。 可以是集合,数组 等。
- Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent
style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。 - 内部迭代: 以前对集合遍历都是通过Iterator或者增强for的方式, 显式的在集合外部进行迭代, 这叫做外部迭
代。 Stream提供了内部迭代的方式,流可以直接调用遍历方法
获取流的两种方式
获取方式 | 集合 | 数组 |
---|
Arr.stream() | List.stream() | Arrays.stream(arr) |
Stream.of(Arr) | Stream.of(list) | Stream.of(arr) |
- 只有单列集合才能获取流
- stream.of(数组) stream.of(1,2,3,4) stream流里存的是一个一个数组中的元素
- stream.of(集合) 流里存的是一个集合
- list.steam() 流里存的是及各中的元素
常用方法
- 延迟方法:返回值类型仍然是 Stream 接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方
法均为延迟方法。) - 终结方法:返回值类型不再是 Stream 接口自身类型的方法,因此不再支持类似 StringBuilder 那样的链式调
用。本小节中,终结方法包括 count 和 forEach 方法
方法名称 | 返回值 | 描述 |
---|
of | stream | 静态方法,Stream.of(集合) |
concat | stream | 静态方法,Stream.concat(stream1,stream2) |
forEach | void | 终结方法,consumer 逐个处理 |
count | long | 终结方法,返回流中的元素个数 |
filter | stream | predicate 保留过滤的元素 |
map | stream | functon 转换(映射)成要求的类型 |
limit stream | stream | 返回 保留前i个元素的stream ) |
skip | stream | 返回 跳过i个元素的stream |
colleciton | 返回对应的集合 | Stream.collect(Collectors.toList) Stream转化成列表 |
代码联系
String[] names = {"lili","nana","luna"};
Stream.of(names).forEach(System.out::println);
取元素长度是4的集合
List<String> myList = list.stream().filter(s -> s.length() == 4).collect(Collectors.toList());
list.stream().filter(s->s.length()==4).forEach(s-> System.out.println(s));
Stream<String> stream3 = Stream.concat(stream1, stream2);
Arrays.stream(arr1).map(s->Integer.parseInt(s)).forEach(s-> System.out.println(s));
Stream<String> stream1 = one.stream().filter(s -> s.length() == 3).limit(3);
Stream<String> stream2 = two.stream().filter(s -> s.startsWith("张")).skip(2);
Stream<String> bigStream = Stream.concat(stream1, stream2);