沙漠鱼的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,你会有不一样的体验。


打赏
最近浏览
Uting  LV3 2023年2月21日
Lu141319  LV1 2022年10月18日
zjw1997 2022年4月30日
暂无贡献等级
wildweather  LV2 2022年3月16日
794821664 2022年3月4日
暂无贡献等级
许墨某 2022年1月14日
暂无贡献等级
wgwyqq  LV10 2022年1月7日
zhos0212  LV19 2021年9月29日
daoge123  LV3 2021年9月22日
RyDu331 2021年7月6日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友