Java allMatch()、anyMatch()、noneMatch()和findFirst()的用法(附带实例)
本节讲解 allMatch()、anyMatch()、noneMatch() 和 findFirst() 这 4 个方法,它们用于判断流中是否有符合条件的数据,查找的结果是一个 boolean 值或一个 Optional 类的对象。
【实例 1】检查所有员工的年龄是否都大于 25 岁。
【实例 2】检查是否有年龄大于或等于 40 岁的员工。本例使用了例 1 定义的 Employee 类,在获取员工集合后,使用 anyMatch() 方法检查公司里是否有年龄在 40 岁或 40 岁以上的员工,具体代码如下:
【实例 3】检查公司是否不存在薪资小于2000元的员工。本例使用了例 1 定义的 Employee 类,在获取员工集合后,使用 noneMatch() 方法检查公司里是否没有薪资小于 2000 元的员工,具体代码如下:
【实例 4】找出第一个年龄等于 21 岁的员工。本例使用了例 1 定义的 Employee 类,在获取员工集合后,首先将年龄为 21 岁的员工过滤出来,然后使用 findFirst() 方法获取第一个员工,具体代码如下:
Java allMatch()方法
allMatch() 是 Stream 接口提供的方法,该方法会判断流中的元素是否全部符合某一条件,返回结果是 boolean 值。如果所有元素都符合条件,则返回 true,否则返回 false。【实例 1】检查所有员工的年龄是否都大于 25 岁。
import java.util.List; import java.util.stream.Stream; import java.util.ArrayList; import java.util.stream.Collectors; public class Employee { private String name; // 姓名 private int age; // 年龄 private double salary; // 工资 private String sex; // 性别 private String dept; // 部门 // 构造方法 public Employee(String name, int age, double salary, String sex, String dept) { this.name = name; this.age = age; this.salary = salary; this.sex = sex; this.dept = dept; } // 重写 toString()方法,方便输出员工信息 public String toString() { return "name=" + name + ", age=" + age + ", salary=" + salary + ", sex=" + sex + ", dept=" + dept; } // 以下是员工属性的 getter 方法 public String getName() { return name; } public int getAge() { return age; } public double getSalary() { return salary; } public String getSex() { return sex; } public String getDept() { return dept; } static List<Employee> getEmpList() { // 提供数据初始化方法 List<Employee> list = new ArrayList<Employee>(); list.add(new Employee("老张", 40, 9000, "男", "运营部")); list.add(new Employee("小刘", 24, 5000, "女", "开发部")); list.add(new Employee("大刚", 32, 7500, "男", "销售部")); list.add(new Employee("翠花", 28, 5500, "女", "销售部")); list.add(new Employee("小马", 21, 3000, "男", "开发部")); list.add(new Employee("老王", 35, 6000, "女", "人事部")); list.add(new Employee("小王", 21, 3000, "女", "人事部")); return list; } } public class AllMatchDemo { public static void main(String[] args) { List<Employee> list = Employee.getEmpList(); // 获取公共类的测试数据 Stream<Employee> stream = list.stream(); // 获取集合流对象 // 判断所有员工的年龄是否都大于 25 岁 boolean result = stream.allMatch(people -> people.getAge() > 25); System.out.println("所有员工的年龄是否都大于 25 岁:" + result); // 输出结果 } }运行结果如下:
所有员工的年龄是否都大于25岁:false
最后得出的结果是 false,因为公司里的“小马”和“小王”的年龄都只有 21 岁,而“小刘”的年龄只有 24 岁,不满足“所有员工的年龄都大于25岁”这个条件。Java anyMatch()方法
anyMatch() 是 Stream 接口提供的方法,该方法会判断流中的元素是否有符合某一条件,只要有一个元素符合条件就返回 true,如果没有元素符合条件,则会返回 false。【实例 2】检查是否有年龄大于或等于 40 岁的员工。本例使用了例 1 定义的 Employee 类,在获取员工集合后,使用 anyMatch() 方法检查公司里是否有年龄在 40 岁或 40 岁以上的员工,具体代码如下:
import java.util.List; import java.util.stream.Stream; public class AnyMatchDemo { public static void main(String[] args) { List<Employee> list = Employee.getEmpList(); // 获取公共类的测试数据 Stream<Employee> stream = list.stream(); // 获取集合流对象 // 判断是否有年龄大于或等于 40 岁的员工 boolean result = stream.anyMatch(people -> people.getAge() >= 40); System.out.println("员工中有年龄在 40 岁或以上的吗?:" + result); // 输出结果 } }运行结果如下:
员工中有年龄在40岁或以上的吗?:true
运行结果为 true,因为公司里的“老张”正好 40 岁,符合“有年龄在40岁或以上的员工”的条件。Java noneMatch()方法
noneMatch() 方法是 Stream 接口提供的方法,该方法会判断流中的所有元素是否都不符合某一条件。这个方法的逻辑和 allMatch() 方法正好相反。【实例 3】检查公司是否不存在薪资小于2000元的员工。本例使用了例 1 定义的 Employee 类,在获取员工集合后,使用 noneMatch() 方法检查公司里是否没有薪资小于 2000 元的员工,具体代码如下:
import java.util.List; import java.util.stream.Stream; public class NoneMatchDemo { public static void main(String[] args) { List<Employee> list = Employee.getEmpList(); // 获取公共类的测试数据 Stream<Employee> stream = list.stream(); // 获取集合流对象 // 判断公司中是否存在薪资小于 2000 元的员工? boolean result = stream.noneMatch(people -> people.getSalary() < 2000); System.out.println("公司中是否存在薪资小于 2000 元的员工?:" + result); // 输出结果 } }运行结果如下:
公司中是否不存在薪资小于2000元的员工?:true
公司最低薪资是 3000元,也就是说没有员工的薪资会小于 2000元,因此结果为 true。Java findFirst()方法
findFirst() 方法是 Stream 接口提供的方法,这个方法会返回符合条件的第一个元素。【实例 4】找出第一个年龄等于 21 岁的员工。本例使用了例 1 定义的 Employee 类,在获取员工集合后,首先将年龄为 21 岁的员工过滤出来,然后使用 findFirst() 方法获取第一个员工,具体代码如下:
import java.util.List; import java.util.Optional; import java.util.stream.Stream; public class FindFirstDemo { public static void main(String[] args) { List<Employee> list = Employee.getEmpList(); // 获取公共类的测试数据 Stream<Employee> stream = list.stream(); // 获取集合流对象 stream = stream.filter(people -> people.getAge() == 21); // 过滤出 21 岁的员工 Optional<Employee> young = stream.findFirst(); // 获取第一个元素 Employee emp = young.get(); // 获取员工对象 System.out.println(emp); // 输出结果 } }运行结果如下:
name=小马, age=21, salary=3000.0, sex=男, dept=开发部
公司里有两个 21 岁的员工,一个是“小马”,一个是“小王”。因为“小马”在集合中的位置靠前,所以 findFirst() 方法获取的是“小马”。注意,这个方法的返回值不是 boolean 值,而是一个 Optional 对象。