+2

Hướng dẫn sử dụng Predicate(vị ngữ) trong java 8

Trong toán học, một Predicate thường được hiểu là một giá trị Boolean hàm P:X ? {true, false}. Được gọi là vị ngữ trên X. Một cách không chính thống, một vị ngữ là đúng hay sai phụ thuộc vào các biến của nó. Nó có thể được coi như là 1 thao tác hay một hàm trả về giá trị đúng hoặc sai

Trong Java 8, Predicate là 1 interface do đó có thể sử dụng cho mục tiêu của lamba expression hoặc method reference. Vì vậy nó thay đổi với các lập trình thông thường là trả về giá trị đúng hoặc sai. Bạn có thể sử dụng Predicate ở bất cứ nơi nào mà bạn cần đánh giá một điều kiện về nhóm hay bộ sưu tập các đối tượng tương tự như vậy mà đánh giá có thể dẫn đến hơacj trong đúng hoặc sai ví dụ

  1. Tìm tất cả trẻ em được sinh ra trong 1 ngày cụ thể
  2. Bánh pizza được đặt hàng trong một thời gian cụ thể
  3. Người lao động lớn hơn độ tuổi nhất định và vv..

Như tôi đã nói, Precicate là 1 interface. Nó có nghĩa là chúng ta có thể vượt qua các biểu thức lambda bất cứ nơi nào được dự kiện. Ví dụ một phương pháp đó là bộ lọc từ giao diện Stream

/**
 * Returns a stream consisting of the elements of this stream that match
 * the given predicate.
 *
 * <p>This is an <a href="package-summary.html#StreamOps">intermediate
 * operation</a>.
 *
 * @param predicate a non-interfering stateless predicate to apply to each element to determine if it
 * should be included in the new returned stream.
 * @return the new stream
 */
Stream<T> filter(Predicate<? super T> predicate);

Stream tôi sẽ đề cập sau, Đối với doanh nghiệp cho phép giả định cho họ 1 cơ chế để tạo ta một chuỗi các tiêu chí hỗ trợ các hoạt động tổng hợp dữ liệu tuần tự và song song, có thể thu nhập dữ liệu trong Stream chỉ bằng 1 lệnh. Vì vậy về cơ bản chúng ta có thể sử dụng Stream và Predicate để lọc ra các yếu tố nhất định từ một nhóm và sau đó thực hiện một số hoạt động trên đó. Chúng ta hãy xem ví dụ bên dưới

Hướng Dẫn Sử Dụng Predicate Trong Java 8

Để chứng minh, chúng ta có một lớp nhân viên như sau:

package fg.predicate;

public class Employee {
    private Integer id;
    private Integer age;
    private String gender;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Employee(Integer id, Integer age, String gender) {
        this.id = id;
        this.age = age;
        this.gender = gender;
    }

    @Override
    public String toString() {
        return this.id.toString() + " - " + this.age.toString();
    }
}

1> Lấy tất cả nhân viên là nam và tuổi lớn hơn 21

public static Predicate<Employee> isAdultMale() {
    return p -> p.getAge() > 21 && p.getGender().equalsIgnoreCase("M");
}

2> Lấy tất cả nhân viên là nữ và tuổi lớn hơn 18

public static Predicate<Employee> isAdultFemale() {
    return p -> p.getAge() > 18 && p.getGender().equalsIgnoreCase("F");
}

3> Lấy tất cả nhân viên có tuổi lớn hơn giá trị tuổi đầu vào

public static Predicate<Employee> isAgeMoreThan(Integer age) {
    return p -> p.getAge() > age;
}

Bạn có thể xây dựng thêm các phương thức lọc dữ liệu cần thiết. Tất cả các phương pháp trên tôi đã tổng hợp ở trong EmployeePredicate.java

package fg.predicate;

import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class EmployeePredicate
{
    public static Predicate<Employee> isAdultMale() {
        return p -> p.getAge() > 21 && p.getGender().equalsIgnoreCase("M");
    }

    public static Predicate<Employee> isAdultFemale() {
        return p -> p.getAge() > 18 && p.getGender().equalsIgnoreCase("F");
    }

    public static Predicate<Employee> isAgeMoreThan(Integer age) {
        return p -> p.getAge() > age;
    }

    public static List<Employee> filterEmployees (List<Employee> employees, Predicate<Employee> predicate) {
        return employees.stream().filter( predicate ).collect(Collectors.<Employee>toList());
    }
}

Tôi đã tạo ra phương thức filterEmployees. Nó cơ bản làm cho mã sạch và ít lặp đi lặp lại. Vì vậy trong chức năng này chúng tôi sẽ lọc ra các danh sách các nhân viên thoả mãn điều vị ngữ. Sau đó sẽ trả về danh sách các nhân viên đáp ứng điều kiện vị ngữ

Dưới đây là một vài ví dụ

package fg.predicate;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Employee e1 = new Employee(1, 23, "M");
        Employee e2 = new Employee(2, 13, "F");
        Employee e3 = new Employee(3, 43, "M");
        Employee e4 = new Employee(4, 26, "M");
        Employee e5 = new Employee(5, 19, "F");
        Employee e6 = new Employee(6, 15, "M");
        Employee e7 = new Employee(7, 68, "F");
        Employee e8 = new Employee(8, 79, "M");
        Employee e9 = new Employee(9, 15, "F");
        Employee e10 = new Employee(10, 45, "M");

        List<Employee> employeeList = new ArrayList<Employee>();
        employeeList.addAll(Arrays.asList(new Employee[] { e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 }));

        System.out.println(EmployeePredicate.filterEmployees(employeeList, EmployeePredicate.isAdultMale()));

        System.out.println(EmployeePredicate.filterEmployees(employeeList, EmployeePredicate.isAdultFemale()));

        System.out.println(EmployeePredicate.filterEmployees(employeeList, EmployeePredicate.isAgeMoreThan(35)));

        System.out.println(EmployeePredicate.filterEmployees(employeeList, EmployeePredicate.isAgeMoreThan(35).negate()));
    }
}

**Output: **

[1 - 23, 3 - 43, 4 - 26, 8 - 79, 10 - 45]
[5 - 19, 7 - 68]
[3 - 43, 7 - 68, 8 - 79, 10 - 45]
[1 - 23, 2 - 13, 4 - 26, 5 - 19, 6 - 15, 9 - 15]

Đây thực sự là một bổ sung rất tốt trong java 8 và tôi thấy rất gọn trong việc sử dụng và code. Code gọn và đẹp tư tưởng hướng tới ngôn ngữ script

Tóm lại về Predicate(Vị ngữ) trong java 8

  1. Di chuyển điều kiện của bạn đến một địa điểm trung tâm. Điều này giúp dễ kiểm chứng
  2. Bất kỳ thay đổi không cần phải nhân đôi nhiều nơi. Nó cải thiện khả năng quản lý code
  3. Các ví dụ trên dễ đọc hơn rất nhiều khi viết một khối if-else

Đó là suy nghĩ của tôi, Bạn nghĩ gì về tính năng này ? Hãy chia sẻ với tôi ở bên dưới.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí