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 对象。
ICP备案:
公安联网备案: