首页 > 编程笔记 > Java笔记 阅读:39

Java allMatch()、anyMatch()、noneMatch()和findFirst()的用法(附带实例)

本节讲解 allMatch()、anyMatch()、noneMatch() 和 findFirst() 这 4 个方法,它们用于判断流中是否有符合条件的数据,查找的结果是一个 boolean 值或一个 Optional 类的对象。

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 对象。

相关文章