Trong Java, Predicate là một functional interface trong package java.util.function. Nó có duy nhất một phương thức test() có kiểu trả về boolean, nhận một tham số có kiểu đối tượng bất kỳ và trả về true hoặc false tùy thuộc vào kết quả so sánh điều kiện.
Các bài viết liên quan:
Predicate được sử dụng rất nhiều trong các phương thức của các lớp trong package java.util và java.util.stream như Stream, List, v.v. để lọc, tìm kiếm và thực hiện các thao tác với các đối tượng theo điều kiện nhất định.
Ví dụ:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Predicate<Integer> isEven = number -> number % 2 == 0; numbers.stream().filter(isEven).forEach(System.out::println);
Trong ví dụ trên, chúng ta tạo ra một đối tượng List chứa các số nguyên và một đối tượng Predicate isEven để kiểm tra xem một số có phải là số chẵn hay không. Tiếp theo, chúng ta sử dụng phương thức filter() để lọc ra các số chẵn trong List và in ra màn hình
Ví dụ khác:
List<String> names = Arrays.asList("John", "Jane", "Mike", "Bob", "Amanda"); Predicate<String> startsWithJ = name -> name.startsWith("J"); names.stream().filter(startsWithJ).forEach(System.out::println);
Trong ví dụ trên, chúng ta tạo ra một đối tượng List chứa các tên và một đối tượng Predicate startsWithJ để kiểm tra xem một tên có bắt đầu bằng chữ J hay không. Tiếp theo, chúng ta sử dụng phương thức filter() để lọc ra các tên bắt đầu bằng chữ J trong List và in ra màn hình.
Predicate cũng có thể được sử dụng với các phương thức khác nhau của Stream, Collection và các lớp khác nhau để thực hiện các thao tác với các đối tượng theo điều kiện nhất định. Nó cũng có thể được sử dụng với các phương thức của các lớp khác nhau như java.util.function.Consumer, java.util.function.Supplier, v.v.
Xem thêm Giao thức Mạng trong TCP/IP
Giới thiệu về Predicate
Predicate là một interface trong Java thuộc gói java.util.function. Nó đại diện cho một điều kiện (condition) mà một đối tượng cần thỏa mãn. Predicate chứa một phương thức duy nhất là test(), được sử dụng để kiểm tra xem một đối tượng có thỏa mãn điều kiện hay không.
Predicate thường được sử dụng trong các tình huống như lọc dữ liệu, kiểm tra điều kiện, xác định tính chất của đối tượng, và nhiều tác vụ xử lý khác trong Java.
Để sử dụng Predicate, bạn cần khai báo một đối tượng Predicate và định nghĩa logic của điều kiện trong phương thức test(). Khi muốn kiểm tra một đối tượng theo điều kiện đó, bạn có thể gọi phương thức test() của Predicate và truyền đối tượng cần kiểm tra vào.
Ví dụ, nếu bạn muốn kiểm tra xem một số nguyên có phải là số chẵn hay không, bạn có thể sử dụng Predicate như sau:
Predicate<Integer> isEven = number -> number % 2 == 0; boolean result = isEven.test(4); // result = true
Trong ví dụ trên, chúng ta đã khai báo một Predicate isEven kiểm tra số nguyên có phải là số chẵn hay không. Phương thức test() được định nghĩa bằng biểu thức lambda, kiểm tra xem số nguyên có chia hết cho 2 hay không. Khi gọi phương thức test() với số 4, kết quả trả về là true.
Predicate trong Java cung cấp nhiều phương thức khác nhau để kết hợp, inverter và xác định điều kiện. Bằng cách sử dụng những phương thức này, bạn có thể xây dựng các điều kiện phức tạp và linh hoạt để sử dụng trong các tác vụ xử lý dữ liệu.
Xem thêm Java Swing Tutorial – hướng dẫn
Cú pháp và cách sử dụng Predicate
Cú pháp và cách sử dụng Predicate trong Java như sau:
- Cú pháp: Để khai báo một Predicate, bạn cần sử dụng generic type để chỉ định kiểu dữ liệu của đối tượng mà Predicate sẽ kiểm tra. Cú pháp tổng quát là:javaCopy code
Predicate<T> predicate = object -> // logic kiểm tra điều kiện
Trong đó,T
là kiểu dữ liệu của đối tượng cần kiểm tra, vàobject
là biến đại diện cho đối tượng đó. Bạn cần định nghĩa logic kiểm tra điều kiện trong phần thân của phương thức test() của Predicate. - Sử dụng Predicate: Để sử dụng Predicate, bạn có thể gọi phương thức test() của nó và truyền đối tượng cần kiểm tra vào. Phương thức test() trả về một giá trị boolean (true hoặc false) tương ứng với kết quả kiểm tra.javaCopy code
boolean result = predicate.test(object);
Trong đó,predicate
là đối tượng Predicate đã khai báo vàobject
là đối tượng cần kiểm tra.
Ví dụ, chúng ta sẽ kiểm tra xem một chuỗi có chứa từ “Java” hay không bằng cách sử dụng Predicate:
Predicate<String> containsJava = str -> str.contains("Java"); boolean result = containsJava.test("Hello, Java"); // result = true
Trong ví dụ trên, chúng ta đã khai báo một Predicate containsJava
kiểm tra xem một chuỗi có chứa từ “Java” hay không. Phương thức test() được định nghĩa bằng biểu thức lambda, kiểm tra xem chuỗi có chứa “Java” không. Khi gọi phương thức test() với chuỗi “Hello, Java”, kết quả trả về là true.
Bạn có thể sử dụng Predicate trong các tình huống lọc dữ liệu, kiểm tra điều kiện, xác định tính chất của đối tượng, và nhiều tác vụ xử lý khác trong Java.
Xem thêm 100+ bài tập Java
Các phương thức quan trọng của Predicate
Predicate trong Java cung cấp một số phương thức quan trọng để kết hợp, inverter và xác định điều kiện. Dưới đây là một số phương thức quan trọng của Predicate:
- test(T t):
- Phương thức này kiểm tra xem đối tượng
t
có thỏa mãn điều kiện hay không. - Trả về
true
nếu đối tượngt
thỏa mãn điều kiện, ngược lại trả vềfalse
.
- Phương thức này kiểm tra xem đối tượng
- and(Predicate super T> other):
- Phương thức này tạo ra một Predicate mới bằng cách kết hợp điều kiện của Predicate hiện tại với một Predicate khác (
other
) bằng toán tử “và” logic. - Trả về một Predicate mới.
- Phương thức này tạo ra một Predicate mới bằng cách kết hợp điều kiện của Predicate hiện tại với một Predicate khác (
- or(Predicate super T> other):
- Phương thức này tạo ra một Predicate mới bằng cách kết hợp điều kiện của Predicate hiện tại với một Predicate khác (
other
) bằng toán tử “hoặc” logic. - Trả về một Predicate mới.
- Phương thức này tạo ra một Predicate mới bằng cách kết hợp điều kiện của Predicate hiện tại với một Predicate khác (
- negate():
- Phương thức này tạo ra một Predicate mới bằng cách đảo ngược điều kiện của Predicate hiện tại.
- Trả về một Predicate mới.
- isEqual(Object targetRef):
- Phương thức này tạo ra một Predicate kiểm tra xem một đối tượng có bằng với một đối tượng khác (
targetRef
) hay không, sử dụng phương thức equals(). - Trả về một Predicate.
- Phương thức này tạo ra một Predicate kiểm tra xem một đối tượng có bằng với một đối tượng khác (
Các phương thức này cho phép bạn xây dựng các điều kiện phức tạp và linh hoạt bằng cách kết hợp, inverter và xác định điều kiện của Predicate. Bằng cách sử dụng những phương thức này, bạn có thể xử lý và kiểm tra các điều kiện đa dạng trong Java một cách dễ dàng và hiệu quả.
Xem thêm Điều kiện if else trong ngôn ngữ SAS
Tại sao nên sử dụng predicate trong java
Sử dụng Predicate trong Java có nhiều lợi ích như sau:
- Tách riêng logic tìm kiếm, lọc, v.v. ra khỏi chính thân hàm hoặc class, giúp cho mã dễ đọc hơn và dễ dàng bảo trì và mở rộng.
- Có thể sử dụng cùng một Predicate với nhiều phương thức khác nhau của Stream, Collection và các lớp khác để thực hiện các thao tác với các đối tượng theo điều kiện nhất định.
- Có thể kết hợp nhiều Predicate với nhau sử dụng các phương thức and(), or(), negate() để tạo ra các điều kiện phức tạp hơn.
- Có thể sử dụng Predicate với các phương thức của các lớp khác nhau như java.util.function.Consumer, java.util.function.Supplier, v.v.
- Giúp cho mã dễ dàng hơn để kiểm thử, vì chúng ta có thể tạo ra các đối tượng Predicate giả để kiểm thử.
Xem thêm java là gì? hướng dẫn kiến thức lập trình java
Ví dụ minh họa về Predicate trong Java
Dưới đây là một ví dụ minh họa về việc sử dụng Predicate trong Java để lọc danh sách sinh viên dựa trên một điều kiện nhất định:
import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; class Student { private String name; private int age; private double gpa; public Student(String name, int age, double gpa) { this.name = name; this.age = age; this.gpa = gpa; } public String getName() { return name; } public int getAge() { return age; } public double getGpa() { return gpa; } } public class Main { public static void main(String[] args) { // Khởi tạo danh sách sinh viên List<Student> students = new ArrayList<>(); students.add(new Student("John", 20, 3.5)); students.add(new Student("Alice", 19, 4.0)); students.add(new Student("Bob", 21, 3.2)); students.add(new Student("Emma", 18, 3.8)); // Predicate kiểm tra điều kiện sinh viên có GPA >= 3.5 Predicate<Student> gpaPredicate = student -> student.getGpa() >= 3.5; // Lọc danh sách sinh viên dựa trên điều kiện GPA List<Student> filteredStudents = filterStudents(students, gpaPredicate); // In ra danh sách sinh viên đã lọc for (Student student : filteredStudents) { System.out.println("Name: " + student.getName() + ", Age: " + student.getAge() + ", GPA: " + student.getGpa()); } } public static List<Student> filterStudents(List<Student> students, Predicate<Student> predicate) { List<Student> filteredList = new ArrayList<>(); for (Student student : students) { if (predicate.test(student)) { filteredList.add(student); } } return filteredList; } }
Trong ví dụ này, chúng ta khởi tạo một danh sách sinh viên và định nghĩa một Predicate (gpaPredicate
) để kiểm tra xem một sinh viên có GPA >= 3.5 hay không. Sau đó, chúng ta sử dụng phương thức filterStudents
để lọc danh sách sinh viên dựa trên Predicate đã định nghĩa. Kết quả là danh sách sinh viên có GPA >= 3.5 được in ra màn hình.