Java8 Stream流使用
破解IDEA请查看:IDEA激活码2022.1最新激活注册码–破解教程「永久激活,亲测有效」
正文
JDK的发行版本都已经衍生至19了,这个从8就引入的Stream流应当是属于Java程序员基操了。然而最近面试遇到开发经验3年的工程师,对它似乎不是很熟悉,让我大吃一惊。本文通过常用的一些简单的例子把它以最小的时间成本给大家说明白。
一、楔子
在使用集合的时候迭代往往是使用的最多的,对比是否使用stream的代码实现
第一次看到这样的写法时,可能会认为这样的代码可读性不高,但当你熟悉之后,你会改变对它的看法。
二、如何创建流
想要使用Stream,首先需要创建一个流,最常见的是直接调用集合的java.util.Collection#stream
方法
当然通过数组同样能够创建
三、流操作的分类
Stream流操作共分为两个大类:惰性求值、及早求值
Stream操作时,先调用了filter方法传入了一个Lambda表达式代表过滤规则,后调用了collect方法表示将流转换为List集合。
我们不需要去记哪些方法是惰性求值,如果方法的返回值是Stream那么它代表的就是惰性求值。如果返回另外一个值或空,那么它代表的就是及早求值。
这些流操作定义之后,在程序中是怎么调用的定义的lambda表达式的?
例如在java.util.stream.ReferencePipeline抽象类中有对Stream接口collect的实现,方法由final修饰,不再支持重写。
四、常用基操
map
映射,x->y,转换数据类型
filter
过滤,“排除不符合某个条件的元素”,也就是返回true的时候保留,返回false排除
sorted
排序,
如果要降序(大-->小),仅需再调用reversed方法Comparator.comparing(Student::getScore).reversed())
这就是声明式编程,你只管叫它做什么,而不像命令式编程叫它如何做。
reduce
对于reduce操作,不建议在现实中使用。
如果你有累加、求最大值、最小值的需求,Stream封装了更简单的方法。
min || max
顾名思义,求取集合中的最小值和最大值。
Java8对Comparator
接口提供了新的静态方法comparing
,这个方法返回Comparator
对象,以前我们需要手动实现compare
比较,现在我们只需要调用Comparator.comparing
静态方法即可。
summaryStatistics
求和操作也是常用的操作,利用reduce会让代码晦涩难懂,特别是复杂的对象类型。
Collectors
前面的大部分操作都是以collect(Collectors.toList())
结尾,看多了自然也大概猜得到它是将流转换为集合对象。最大的功劳当属Java8新提供的类——Collectors
收集器。
示例给出比较常见的List和Map的转换,