点击上方 蓝色字体 ,选择“设置星标”
优质文章,第一时间送达
文章转自:占小狼的博客
一直在写中间件相关的代码,提供SDK给业务方使用,但很多业务方还一直停留在1.7版本,迟迟不升级,为了兼容性,不敢在代码中使用Java8的一些新特性,比如Stream之类的,虽然不能用,但还是要学一下。
Stream 是Java 8中添加的一个新特性,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。 它借助于 Lambda 表达式,可以让你以一种声明的方式处理数据,可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
直接上Demo,感受一下
当使用一个流的时候,通常包括三个基本步骤:
获取一个数据源(source)
数据转换
执行操作获取想要的结果
每次转换原有 Stream 对象不改变,返回一个新的 Stream 对象(可以有多次转换),这就允许对其操作可以像链条一样排列,变成一个管道,如下图所示。
在Stream中,分为两种操作
中间操作
结束操作
中间操作返回Stream,终端操作返回void或者非Stream结果,在demo中, filter
、 map
、 sorted
都算是中间操作,而 forEach
是一个结束操作。
创建Stream的方式很多,最常见的是从Collections,List 和 Set中生成
在对象myList上调用方法 stream() 返回一个常规对象Stream。
也可以从一堆已知对象中生成。
当然了,还有其它方式:
Collection.stream()
Collection.parallelStream()
BufferedReader.lines()
Files.walk()
BitSet.stream()
Random.ints()
JarFile.stream()
....
forEach
方法接收一个 Lambda 表达式,用来迭代流中的每个数据
map
用于映射每个元素到对应的结果
filter
用于通过设置的条件过滤出元素
limit
用于用于获取指定数量的流
sorted
用于对流进行排序
有三个 match 方法,从语义上说:
allMatch:Stream 中全部元素符合传入的 predicate,返回 true
anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true
noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true
它们都不是要遍历全部元素才能返回结果。 例如 allMatch 只要一个元素不满足条件,就 skip 剩下的所有元素,返回 false。
reduce
方法根据指定的函数将元素序列累积到某个值。 此方法有两个参数:
起始值
累加器函数。
如果有一个List
Collectors类中提供了功能丰富的工具方法
toList
toSet
toCollection
toMap
...
而这些方法,都需要通过 collect
方法传入。
collect
可以把Stream数据流转化为Collection对象,
除了常规的对象Stream,还有一些有特殊类型的Stream,用于处理基本数据类型int、long和double,它是IntStream、LongStream和DoubleStream。
比如可以使用IntStream.range()来代替常规的for循环。
Random的ints方法可以返回一个随机数据流,比如返回1到100的10个随机数。
总之,Stream 的特性可以归纳为:
Stream并不是一种数据结构,它只是某种数据源的一个视图
对Stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新Stream。
Stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
Stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。
所有 Stream 的操作必须以 lambda 表达式为参数
遗漏热文?赶紧标星
1. 阿里社招面试指南
2. 阿里应届生面试指南
3. 探寻线程池是如何工作的
4. 到底线程池应该设置多少合适?
5. 跳槽的必备条件是有一份好的简历
6. 不是所有的 Github 都适合写在简历上
7. 所没有项目经验找工作处处碰壁怎么办
8. 每一个开发人员都应该懂得的 UML 规范
9. 工作环境没机会接触高并发、分布式怎么办?
10. 这算是有史以来讲数据库连接池数最清楚的文章了
11. 你以为认为 count(1) 比 count(*) 效率高么?
12. 用了这么多年 Spring Boot 你知道他爹有多大背景吗?