算我求你了!请避开Java Stream流式编程常见的坑( 二 )

(2)终端操作
终端操作将stream流转成具体的返回值 , 比如List , Integer等 。 常见的终端操作有:foreach, min, max, count等 。
foreach很常见了 , 下面举一个max的例子 。
// 找出最大的值List integers = Arrays.asList(6, 20, 19);integers.stream().max(Integer::compareTo).ifPresent(System.out::println);// output: 20复制代码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流式编程常见的坑】作者:爱笑的架构师链接:来源:掘金著作权归作者所有 。 商业转载请联系作者获得授权 , 非商业转载请注明出处 。