不想再用for嵌套for操作了,java8 带来了新的API —— Stream,非常强大!
Stream中文翻译成流,是一个支持串行和并行操作元素的序列,也是Lambda表达式配合使用的强大工具。
源码在java.util.stream中,感兴趣可以阅读阅读。
0x00 java8 中的流是什么
在编程中,对一串数据进行0个或者多个中间操作后,最后再获得结果。这个操作在没有流的情况下一般会涉及到多次循环,这是非常低效的。
流是为了处理一串数据(sequence),而不需要多次循环的一种方式。
流在操作序列的时候,会将数据放在一个叫Stream Pipeline的地方,这个地方会有三部分
- 源(一般为集合)
- 0或多个中间操作 (一般为惰性操作,不会直接操作数据)
- 终止操作 (一般为求最终值,这时流的整个流程结束)
流支持并行操作,而迭代器,for循环都是串行操作,所以流在多核处理上有强大优势。
1x00 Stream的类型和创建方式
创建流
12345678910// 从数组创建int [] source = {1,2,3,4,5,6};IntStream s = Arrays.stream(source);// 从集合创建List list = Arrays.asList(1,2,3,4,5);Stream s2 = list.stream();// 创建1到10的流IntStream s3 = IntStream.range(1,10);// 直接创建Stream s4 = Stream.of("wo", "ai", "?")其他流
此外,流还提供了几种包装好的流:12// 支持串行并行操作的序列,元素只有double类型的流DoubleStream
|
|
|
|
2x00 常用的流方法
这里不过多提及,最好看一看API文档,我这里举一些常用的例子
例子:
|
|
|
|
假设有N条营业数据,前5条是无关的测试数据,中间10条是要参加考核的,参与考核的需要知道其中超过50w(包括50)的数据的交易额平均值,其他不参与考核的忽略。
测试数据如下:{11, 9, 2, 13, 1, 2, 99, 54, 23, 66, 70, 23, 46, 50, 100, 10, 24, 18, 19, 2};
|
|
以上为流的一些基础使用方法。后续会有一些详细的补充,容我后面填坑。
3x00 流的特性
- 基于集合或者序列
- 流不存储值,也不能重复使用,数据通过管道的方式进行操作
- 每个操作都是函数式的,对流的操作不会影响源数据
- 多数操作(排序,映射,过滤等),可以延迟实现
基于集合和序列就不写例子了,不存储值也是一个概念,下面验证一下流不能重复使用。
#####3x01 不能重复使用
当我第二次使用trans时,报错了。
流只能使用一次,无法重复使用
3x02 验证流延迟操作
流只要在终止操作(及早求值)时,才会对数据统一做操作,在没有遇到求值操作的时候,惰性操作代码不会被执行。
3x02 不影响源数据
可以创建一个List去实践,这里不写代码,当流执行完成之后,源List的数据是不会发生变化的
大家可以自己实践一下
by:Zing
转载请注明出处:https://micorochio.github.io/2018/01/22/the-stream-in-java8-01/