Java Predicate

Người dịch: Dương Xuân Long - Học viên lớp Java10
Email liên hệ: linesco218@gmail.com
Bài viết gốc: zetcode.com

Java Predicate

Predicates trong java được triển khai với interfaces.Predicate là một interface chức năng chung đại diện một hàm mệnh đề mà trả lại giá trị boolean. Nở trong gói java.util.function package. Predicates có chứa một hàm test(T t) mà đánh giá the Predicate(tính dúng sai) trong mệnh đề được cung cấp.

Trong java chúng ta không có hàm đứng một mình. Hơn nữa, hàm không phải được ưu tiên hàng đầu( hmaf không thể đưa vào một collections hoặc truyền vào một hàm khác như tham số). Vậy, chúng ta định nghĩa interfaces và tạo đối tượng từ những interfaces này. Như vậy đối tượng có thể truyền được vào hàm . Với java lambdas sẽ dễ hơn để làm việc với predicates.

1.Ví dụ Java Predicate

Ví dụ sau đây tạo ra một Java Predicate đơn giản.

package com.zetcode;

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

class BiggerThanFive<E> implements Predicate<Integer> {

    @Override
    public boolean test(Integer v) {

        Integer five = 5;

        return v > five;
    }
}

public class JavaPredicateEx {

    public static void main(String[] args) {

        List<Integer> nums = List.of(2, 3, 1, 5, 6, 7, 8, 9, 12);

        BiggerThanFive<Integer> btf = new BiggerThanFive<>();
        nums.stream().filter(btf).forEach(System.out::println);
    }
}

Trong ví dụ này predicate được dùng để lọc ra số nguyên.

class BiggerThanFive<E> implements Predicate<Integer> {

    @Override
    public boolean test(Integer v) {
        
        Integer five = 5;
        
        return v > five;
    }
}

Đây là một java class triển khai Predicate interface.

List<Integer> nums = List.of(2, 3, 1, 5, 6, 7, 8, 9, 12);

Chúng ta có một danh sách số nguyên.

BiggerThanFive<Integer> btf = new BiggerThanFive<>();

Một BiggerThanFive được khởi tạo.

nums.stream().filter(btf).forEach(System.out::println);
The predicate object is passed to the filter method to get all values from the list that are bigger than five.
đối tượng predicate được truyền vào hàm filter để lấy ra tất cả các giá trị từ danh sách mà >5.

$ java JavaPredicateEx.java
6
7
8
9
12

2.Java Predicate với lambda

Kí hiệu Java lamda làm đơn giản việc tạo ra java predicates.

com/zetcode/JavaPredicateEx2.java
package com.zetcode;

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

public class JavaPredicateEx2 {

    public static void main(String[] args) {

        List<Integer> nums = List.of(2, 3, 1, 5, 6, 7, 8, 9, 12);

        Predicate<Integer> btf = n -> n > 5;

        nums.stream().filter(btf).forEach(System.out::println);
    }
}

Ví dụ lần này chúng ta dùng lí hiệu Java lambda đã làm code gọn gàng hơn.

Predicate<Integer> btf = n -> n > 5;

Đây là một dòng để tạo ra predicate.

3.Java Predicate removeIf

Hàm removeif của ArrayList xóa tất cả phần tử thỏa mãn predicate được cung cấp.

com/zetcode/ListRemoveIf.java
package com.zetcode;

import java.util.ArrayList;
import java.util.function.Predicate;

public class ListRemoveIf {

    public static void main(String[] args) {

        var words = new ArrayList<String>();
        words.add("sky");
        words.add("warm");
        words.add("winter");
        words.add("cloud");
        words.add("pen");
        words.add("den");
        words.add("tree");
        words.add("sun");
        words.add("silk");

        Predicate<String> hasThreeChars = word -> word.length() == 3;
        words.removeIf(hasThreeChars);

        System.out.println(words);
    }
}

Chúng ta có một danh sách các từ. Chúng ta xóa tất cả các từ từ danh sách mà có 3 chữ latin trở lên.

$ java ListRemoveIf.java
[warm, winter, cloud, tree, silk]

4.Java Predicate Collectors.PartitioningBy

Collectors.PartitioningBy trả lại một Collector mà chia bộ phận elements theo một Predicate, và sắp xếp chúng thành một Map<Boolean, List>.

com/zetcode/CollectorsPartitioningBy.java
package com.zetcode;

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

public class CollectorsPartitioningBy {

    public static void main(String[] args) {

        var values = List.of(3, -1, 2, 4, -1, 1, 2, 3);

        Predicate<Integer> isPositive = e -> e > 0;

        Map<Boolean, List<Integer>> groups = values.stream()
                .collect(Collectors.partitioningBy(isPositive));
                
        System.out.println(groups.get(true));
        System.out.println(groups.get(false));

        List<List<Integer>> subSets = new ArrayList<>(groups.values());
        System.out.println(subSets);
    }
}

Chúng ta có một danh sách các số nguyên. Danh sách được chia ra làm hai danh sách nhỏ: giá trị âm và giá trị dương.

$ java CollectorsPartitioningBy.java
[4, 1, 2, 3]
[-3, -1, -2, -1]
[[-3, -1, -2, -1], [4, 1, 2, 3]]

4.Kết luận

Predicate có rất nhiều ứng dụng trong java bài viết chỉ nêu ra một số trường hợp điển hình.