写点什么

Java 中的 Stream 用还是不用

用户头像
孙苏勇
关注
发布于: 2020 年 04 月 24 日
Java中的Stream用还是不用

Stream虽然加入Java也有些年头了,但是在工程中要不要应用还是有不同的声音存在。看过一些认为Stream比较鸡肋的说法,在很多情况下性能也低于普通迭代器,数据量大了还有大数据据那一套处理数据的方式,等等。



对用不用,我觉得还是看具体的应用场景,如果只是简单遍历,其中的业务规则也并复杂,那确实用什么方式差别不大,可能主要差别就是代码量上会有些差,对可读性、性能都没实质性的差别。试想这么一个应用,现在我们有了一组员工的数据,业务规则为“给定一组员工数据,筛选出所有薪资高于150的员工,并按性别分组,组内按年龄大小和薪资高低排序”。



考虑不使用Steam的方式,那可能需要把问题分解成几步,实现比较器对数据排序,遍历,过滤出薪资高于150的员工,按性别放入不同的列表,最后以要求的数据结构返回。代码就不示例了,需要多少代码可能大家也能心里有个大概数。但是如果用Stream来做这个业务,从思考过程和代码上都会显得更为清晰简洁,所以就这个需求,我们用Stream实现如下:

Map<Gender, List<Employee>> result = employees.stream()
.filter(employee -> employee.getSalary() > 150)
.sorted(Comparator.comparing(Employee::getAge, Comparator.reverseOrder())
.thenComparing(Employee::getSalary, Comparator.reverseOrder()))
.collect(Collectors.groupingBy(Employee::getGender));



代码实现上基本顺着业务规则就出来了,首先过滤,然后多级排序,最后分组收集。当然对于更复杂的业务规则处理,业务方法中有异常等情况,那处理上需要考虑这些应对这些情形。



就我自己来说,如果使用Stream从理解上更容易,我是会优先使用Stream的,用Stream要转换成多线程的处理方式也更简单,可以有效降低代码的复杂性。如果Stream链路上要处理的规则太多,那可以考虑拆分步骤或加适当的注释说明,对可读性影响并不大。至于性能,当测试有明确指向使用Stream的实现部分有性能问题时再考虑替代方案。

发布于: 2020 年 04 月 24 日阅读数: 73
用户头像

孙苏勇

关注

不读书,思想就会停止。 2018.04.05 加入

公众号“像什么",记录想记录的。

评论

发布
暂无评论
Java中的Stream用还是不用