沙漠鱼的gravatar头像
沙漠鱼2020-07-31 11:07:16
巧用Java8中的Stream,让集合操作飞起来!

java8也出来好久了,接口默认方法,lambda表达式,函数式接口,Date API等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下lambda表达式,经常还要对集合进行过滤和排序,Stream就派上用场了。用习惯了,不得不说真的很好用。

Stream作为java8的新特性,基于lambda表达式,是对集合对象功能的增强,它专注于对集合对象进行各种高效、便利的聚合操作或者大批量的数据操作,提高了编程效率和代码可读性。

Stream的原理:将要处理的元素看做一种流,流在管道中传输,并且可以在管道的节点上处理,包括过滤筛选、去重、排序、聚合等。元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结果。

集合有两种方式生成流:

  • stream() − 为集合创建串行流
  • parallelStream() - 为集合创建并行流

巧用Java8中的Stream,让集合操作飞起来!

上图中是Stream类的类结构图,里面包含了大部分的中间和终止操作。

中间操作主要有以下方法(此类型方法返回的都是Stream):map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

终止操作主要有以下方法:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

举例说明

首先为了说明Stream对对象集合的操作,新建一个Student类(学生类),覆写了equals()和hashCode()方法

巧用Java8中的Stream,让集合操作飞起来!

filter(筛选)

巧用Java8中的Stream,让集合操作飞起来!

运行结果:

巧用Java8中的Stream,让集合操作飞起来!

这里我们创建了四个学生,经过filter的筛选,筛选出地址是浙江的学生集合。

map(转换)

巧用Java8中的Stream,让集合操作飞起来!

运行结果

巧用Java8中的Stream,让集合操作飞起来!

map就是将对应的元素按照给定的方法进行转换。

 

distinct(去重)

巧用Java8中的Stream,让集合操作飞起来!

运行结果:

巧用Java8中的Stream,让集合操作飞起来!

巧用Java8中的Stream,让集合操作飞起来!

运行结果:

巧用Java8中的Stream,让集合操作飞起来!

可以看出,两个重复的“肖战”同学进行了去重,这不仅因为使用了distinct()方法,而且因为Student对象重写了equals和hashCode()方法,否则去重是无效的。

sorted(排序)

巧用Java8中的Stream,让集合操作飞起来!

巧用Java8中的Stream,让集合操作飞起来!

巧用Java8中的Stream,让集合操作飞起来!

巧用Java8中的Stream,让集合操作飞起来!

上面指定排序规则,先按照学生的id进行降序排序,再按照年龄进行降序排序

limit(限制返回个数)

巧用Java8中的Stream,让集合操作飞起来!

巧用Java8中的Stream,让集合操作飞起来!

skip(删除元素)

巧用Java8中的Stream,让集合操作飞起来!

巧用Java8中的Stream,让集合操作飞起来!

reduce(聚合)

巧用Java8中的Stream,让集合操作飞起来!

巧用Java8中的Stream,让集合操作飞起来!

min(求最小值)

巧用Java8中的Stream,让集合操作飞起来!

运行结果:

巧用Java8中的Stream,让集合操作飞起来!

上面是求所有学生中年龄最小的一个,max同理,求最大值。

anyMatch/allMatch/noneMatch(匹配)

巧用Java8中的Stream,让集合操作飞起来!

运行结果:

巧用Java8中的Stream,让集合操作飞起来!

anyMatch:Stream 中任意一个元素符合传入的 predicate,返回 true

allMatch:Stream 中全部元素符合传入的 predicate,返回 true

noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true

总结

上面介绍了Stream常用的一些方法,虽然对集合的遍历和操作可以用以前常规的方式,

但是当业务逻辑复杂的时候,你会发现代码量很多,可读性很差,明明一行代码解决的事情,

你却写了好几行。试试lambda表达式,试试Stream,你会有不一样的体验。


打赏
最近浏览
1403587921 LV19月19日
星星
kinggode LV149月18日
月亮月亮月亮星星星星
柠檬不想上岸 LV19月17日
星星
Magic丶M LV59月15日
月亮星星
酷酷的轲 LV89月14日
月亮月亮
woldxy LV99月14日
月亮月亮星星
487948123 LV79月14日
月亮星星星星星星
Yang哈哈 LV59月11日
月亮星星
fanghao LV159月10日
月亮月亮月亮星星星星星星
懒得起 LV79月9日
月亮星星星星星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友