java8流式编程,你值得拥有!

其实Java流式编程是java8的新特性了.现在JDK都出到15了…当然JDK15不是长期支持版本,最新的长期支持版本是Java11,而下一个长期支持版本要等到2021年9月发布的Java17.

一、什么是Stream

Stream中文称为”流”,通过将集合转换为”流”的元素序列,通过声明性方式,能够对集合中的每个元素进行一系列并行或串行的流水线操作.

二、流操作

 整个流操作就是一条流水线,将元素放在流水线上一个个地进行处理
其中数据源就是原始集合,然后将如List的集合转换为Stream类型的流,并对流进行一系列的中间操作,比如过滤保留部分元素,对元素进行排序、类型转换等;最后再进行一个终端操作,可以把Stream转换回集合类型,也可以直接对其中的各个元素进行处理,比如打印、计算总数、计算最大值等等.
很多流操作本身就会返回一个流,所以多个操作可以直接连接起来:
 如果是以前,进行这么一系列操作,你需要做个迭代器或者foreach循环,然后遍历,一步步亲历亲为地去实现这些操作.但是如果使用流,你便可以直接声明式地下指令,流会帮你完成这些操作.
这就像SQL语句一样,select username from user where id = 1,你只要说明:”我需要id是1(id = 1)的用户(user)的用户名(username)”,那么就可以得到自己想要的数据,而不需要自己亲自去数据库里面循环遍历查找.

三、项目实际应用

功能概述:现在有一个接口需要查询出数据库用户所在的数据源的未授权的表. 未授权的表=已落地的表-已授权的表.
假如已落地的表list1简化为{1,2,3,4,5,6,7,8,9},已授权的表list2简化为{2,4,5,8},那么未授权的表list3就应该是{1,3,6,7,9}
如果不用流式编程,那么就需要遍历list1和list2,然后判断一下list1的值是否有等于list2的值的,是的话就把该值remove.
用流式编程只需要一行代码:

list1.stream().filter(x -> !list2.contains(x)).collect(Collectors.toList());

简单说明一下:首先把集合list1转换为stream(流),然后进行过滤,filter会保留判断条件为true的记录.x ->这里的x也可以写成a,b,c之类的,起到的作用是记录list1流中的数据. 最后的collect是把流收集起来,Collectors.toList()是把收集的流转换成list集合返回.
在使用过程中,对于某些关键步骤,可以考虑使用函数引用来替代复杂的、多个语句的 lambda 表达式,用函数名简单描述要做的事情.这里给出个例子:

public void refactorAfter() {
    List<Student> 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 && student.getScore() > 95;
}

总结:流式编程可以极快地处理多个集合的相关操作,大大提高了开发效率.在你有了一定了解后可阅读性也是大大提高的