继之前了解了StreamAPI的创建以及中间操作后,今天主要说一下StreamAPI的最后一步,也就是终止操作。
终止操作主要有查找与匹配,以及归约与收集,这些操作很像我们平时的sql操作,也比较好理解。
首先看看查找与匹配,有这样几种操作:
allMatch-检查是否匹配所有元素
anyMatch-检查是否至少匹配一个元素
noneMatch-检查是否没有匹配所有元素
findFirst-返回第一个找到的元素
findAny-返回任意一个找到的元素
count-返回流中的元素个数
max-返回流中的最大值
min-返回流中的最小值
接下来我们逐一看看他们的用法:
首先是allMatch,比如我们有这样一个学生集合:
List<Student> stus= Arrays.asList(
new Student("张三",16,168.25, Student.Status.FREE),
new Student("李四",48,178.25,Student.Status.VOCATION),
new Student("王五",12,148.45,Student.Status.BUSY),
new Student("赵六",18,180.68,Student.Status.FREE),
new Student("田七",18,180.68,Student.Status.VOCATION)
);
我们想知道该集合中的每个学生是不是状态都为BUSY,先看allMatch方法源码:
这是一个参数为断言型接口返回值为布尔值的方法,说明我们使用该方法会得到true或false两种结果:
接下来完成我们的功能:
boolean b1 = stus.stream().allMatch((e)->e.getStatus().equals(Student.Status.BUSY));
System.out.println(b1);
很明显,结果会是false
类似的,anyMatch方法也是这样使用,但因为它是用于检查是否有一个学生状态为BUSY,所以运行结果会是true
boolean b2=stus.stream().anyMatch(e->e.getStatus().equals(Student.Status.BUSY));
System.out.println(b2);
接下来是noneMatch方法,检查是否全部状态不为BUSY,结果为false
boolean b3=stus.stream().noneMatch(e->e.getStatus().equals(Student.Status.BUSY));
System.out.println(b3);
接下来是两个比较特殊的方法findFirst和findAny,由于两者使用类似,我们放在一起,我们以findFirst为例,先查看该方法的源码:
这是一个无参数但返回值为Optional对象的方法,Optional对象是JAVA8的又一新特性,它用于帮助我们解决泛型中的对象是否为空,避免空指针异常的出现,这里我们往后再提,既然需要这样一个类型,那么我们就用这样一个类型进行接收,假设我们需要找到集合中身高最高的学生,我们可以先按照身高进行排序,再使用findFirst方法取到第一个学生,即为身高最高的学生:
Optional<Student> optional=stus.stream().sorted((e1, e2)->-Double.compare(e1.getHeight(),e2.getHeight())).findFirst();
System.out.println(optional.get());
注意在比较时带上-号,这样才是从大到小进行排序,得到满足条件的学生后,我们使用Optional类中的get方法取出该Student对象,并进行打印,结果如下: