Lucent's Blog

当时明月在,曾照彩云归。



代码在写我

Bug在De我

螃蟹在剥我的壳

漫天的我落在雪花上

而你在想我...

6ams5piO5pyI

Stream查找与匹配元素

在对数组或者集合类进行操作的时候,经常会遇到这样的需求,比如:

  • 是否包含某一个“匹配规则”的元素
  • 是否所有的元素都符合某一个“匹配规则”
  • 是否所有元素都不符合某一个“匹配规则”
  • 查找第一个符合“匹配规则”的元素
  • 查找任意一个符合“匹配规则”的元素

这些需求如果用for循环去写的话,还是比较麻烦的,需要使用到for循环和break。下面使用Stream来完成这些操作。

何用Stream API来实现“查找与匹配”

Employee员工类:

@Data
@AllArgsConstructor
public class Employee {
   private Integer id;
   private Integer age;   //年龄
   private String gender;  //性别
   private String firstName;  
   private String lastName;
}

创建10个员工:

Employee e1 = new Employee(1,23,"M","Rick","Beethovan");
Employee e2 = new Employee(2,13,"F","Martina","Hengis");
Employee e3 = new Employee(3,43,"M","Ricky","Martin");
Employee e4 = new Employee(4,26,"M","Jon","Lowman");
Employee e5 = new Employee(5,19,"F","Cristine","Maria");
Employee e6 = new Employee(6,15,"M","David","Feezor");
Employee e7 = new Employee(7,68,"F","Melissa","Roy");
Employee e8 = new Employee(8,79,"M","Alex","Gussin");
Employee e9 = new Employee(9,15,"F","Neetu","Singh");
Employee e10 = new Employee(10,45,"M","Naveen","Jain");
List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);

不用Stream API实现,查找员工列表中是否包含年龄大于70的员工,代码如下:

boolean isExistAgeThan70 = false;
for(Employee employee:employees){
  if(employee.getAge() > 70){
    isExistAgeThan70 = true;
    break;
  }
}

使用Stream API实现,代码如下:

boolean isExistAgeThan72 = employees.stream().anyMatch(e -> e.getAge() > 72);
  • anyMatch,判断Stream流中是否包含某一个“匹配规则”的元素。这个匹配规则可以是lambda表达式或者谓词。

其他匹配规则函数介绍

是否所有员工的年龄都大于10岁?allMatch匹配规则函数:判断是够Stream流中的所有元素都符合某一个"匹配规则"。

boolean isExistAgeThan10 = employees.stream().allMatch(e -> e.getAge() > 10);

是否不存在小于18岁的员工?noneMatch匹配规则函数:判断是否Stream流中的所有元素都不符合某一个"匹配规则"。

boolean isExistAgeLess18 = employees.stream().noneMatch(e -> e.getAge() < 18);

元素查找与Optional

从列表中按照顺序查找第一个年龄大于40的员工。

Optional<Employee> employeeOptional
        =  employees.stream().filter(e -> e.getAge() > 40).findFirst();
System.out.println(employeeOptional.get());
  • findFirst用于查找第一个符合“匹配规则”的元素,返回值为Optional
  • indAny用于查找任意一个符合“匹配规则”的元素,返回值为Optional

结果:

Employee(id=3, age=43, gender=M, firstName=Ricky, lastName=Martin)

Optional类代表一个值存在或者不存在。在java8中引入。

  • isPresent() 将在 Optional 包含值的时候返回 true , 否则返回 false 。
  • fPresent(Consumer block) 会在值存在的时候执行给定的代码块。
  • T get() 会在值存在时返回值,否则?出一个 NoSuchElement 异常。
  • T orElse(T other) 会在值存在时返回值,否则返回一个默认值。
最近的文章

StreamAPI终端操作

JavaStream管道流是用于简化集合类元素处理的javaAPI。在使用的过程中分为三个阶段:将集合、数组、或行文本文件转换为javaStream管道流管道流式数据处理操作,处理管道中的每一个元素。上一个管道中的输出元素作为下一个管道的输入元素。管道流结果处理操作…

继续阅读
更早的文章

函数式接口Comparator

函数式接口是什么?所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口。Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare。…

继续阅读