算我求你了!请避开Java Stream流式编程常见的坑( 二 )
(2)终端操作
终端操作将stream流转成具体的返回值 , 比如List , Integer等 。 常见的终端操作有:foreach, min, max, count等 。
foreach很常见了 , 下面举一个max的例子 。
// 找出最大的值List
5. 实战:使用Stream重构老代码假如有一个需求:过滤出年龄大于20岁并且分数大于95的学生 。
使用for循环写法:
private List getStudents() {Student s1 = new Student("xiaoli", 18, 95);Student s2 = new Student("xiaoming", 21, 100);Student s3 = new Student("xiaohua", 19, 98);List studentList = Lists.newArrayList();studentList.add(s1);studentList.add(s2);studentList.add(s3);return studentList;}public void refactorBefore() {List studentList = getStudents();// 使用临时listList resultList = Lists.newArrayList();for (Student s : studentList) {if (s.getAge() > 20}}// output: Student{name=xiaoming, age=21, score=100}resultList.forEach(System.out::println);}复制代码
使用for循环会初始化一个临时list用来存放最终的结果 , 整体看起来不够优雅和简洁 。
使用lambda和stream重构后:
public void refactorAfter() {List studentLists = getStudents();// output: Student{name=xiaoming, age=21, score=100}studentLists.stream().filter(this::filterStudents).forEach(System.out::println);}private boolean filterStudents(Student student) {// 过滤出年龄大于20岁并且分数大于95的学生return student.getAge() > 20 }复制代码
使用filter和方法引用使代码清晰明了 , 也不用声明一个临时list , 非常方便 。
6. 使用Stream常见的误区(1)误区一:重复消费stream对象
stream对象一旦被消费 , 不能再次重复消费 。
List strings = Arrays.asList("hello", "java8", "stream");Stream stream = strings.stream();stream.forEach(System.out::println); // okstream.forEach(System.out::println); // IllegalStateException复制代码
上述代码执行后报错:
java.lang.IllegalStateException: stream has already been operated upon or closed
(2)误区二:修改数据源
在流操作的过程中尝试添加新的string对象 , 结果报错:
List strings = Arrays.asList("hello", "java8", "stream");// expect: HELLO JAVA8 STREAM WORLD, but throw UnsupportedOperationExceptionstrings.stream().map(s -> {strings.add("world");return s.toUpperCase();}).forEach(System.out::println);复制代码
注意:一定不要在操作流的过程中修改数据源 。
总结java8 流式编程在一定程度上可以使代码变得优美 , 不过也要避开常见的坑 , 如:不要重复消费对象、不要修改数据源 。
-- END --
日常求赞:你好技术人 , 先赞再看养成习惯 , 你的赞是我前进道路上的动力 , 下期更精彩 。
【算我求你了!请避开Java Stream流式编程常见的坑】作者:爱笑的架构师链接:来源:掘金著作权归作者所有 。 商业转载请联系作者获得授权 , 非商业转载请注明出处 。
- 发展|我省要求互联网平台坚持依法合规经营 推动线上经济健康规范发展
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 印度|拒绝华为后,印度、英国斥资数十亿求助日本
- 承受|折叠屏iPhone已开始测试?要求能承受10万次折叠,或在2年后发布
- 区企联企协|谋求更高质量的转型发展!区企联企协与区科技局成功举办科技考察对接活动
- 品牌|为求差异化 山姆升级自有品牌Member’s Mark
- 中国|意大利制造求助中国网站,意外交部长出马见证
- 需求|需求下降!传三星可能停售高端Galaxy Note智能手机,重心转移至可折叠手机
- 系列|首销300000台!红米Note 9系列,或许可以说恭喜你了?
- 高像素|加持高像素只为解析力?vivo S7丛林秘境展对样张细节的要求更严苛