一、前提
什么是流?在用JDK1.8的你肯定知道我就不多bb了。本篇主要介绍一下内容:
- 流的创建
- 流的操作
- 流的结束
听上去是不是很弟弟,别急,看完这篇,让你用流信手拈来。😎
二、流基本介绍
什么是流
- JDK8提供的对集合数据进行处理的一种方式
- 流中的元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算
- 数据源流的来源。 可以是集合,数组,I/O channel, 产生器generator 等
- 有聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等
流的特点
- 一个流只能使用一次
- Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style),这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)
- 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代, Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现
串行流和并行流
顾名思义,串行流是一个个的执行,相当于单线程,并行流是并行执行,相当于多线程。
- 创建串行流:stream()
- 创建并行流:parallelStream()
根据实际测试,在数据量比较大的时候,并行流的速度快串行流1.5到3倍,看实际需求有所不同。
三、正文
好,前面都是对流一点都不知道的人说的废话,下面进入正文
1.各个容器类实现Stream的方式
本节覆盖了日常能用到的容器、数组、IO创建流的方式:
@Test
public void getStreamTest()
{
/**
* {@code Collection}在JDK1.8版本实现了Stream()方法和parallelStream()方法,
* 所有实现Collection的容器类通过调用stream()方法或者 parallelStream()
*/
// list
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.stream();
// Set
Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);
set.add(3);
set.stream();
// ArrayList
ArrayList<Integer> arrList = new ArrayList<>();
arrList.add(1);
arrList.add(2);
arrList.stream();
// Vector
Vector<Integer> vector = new Vector<>();
vector.add(1);
vector.add(2);
vector.stream();
// Queue
Queue<Integer> queue = new ArrayBlockingQueue<>(12);
queue.add(1);
queue.add(2);
queue.stream();
// Stack
Stack<Integer> stack = new Stack<>();
stack.add(1);
stack.add(2);
stack.stream();
// Map 通过调用map的entrySet()方法,获取Set再调用stream()
Map<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2,