使用Predicate操作集合

Java 8 为 Collection 集合新增了一个 removeIf(Predicate filter) 方法,该方法将会批量删除符合 filter 条件的所有元素。不难发现,removeIf() 方法需要一个 Predicate 对象作为参数。因为 Predicate 是一个函数式接口,所以可使用 Lambda 表达式作为 removeIf() 方法的参数。

那么,Predicate 的使用场景都有哪些呢?下面通过示例分别进行说明。

过滤集合

例如,定义一个 Collection 集合,向 Collection 集合中添加 “Java 从入门到精通”、“C语言从入门到精通”、“C#从入门到精通” 3 个元素后,先使用 removeIf() 方法批量删除 Collection 集合中字符串长度大于 8 的元素,再把 Collection 集合中的剩余元素输出到控制台上。代码如下:

import java.util.ArrayList;
import java.util.Collection;

public class Test {
    public static void main(String[] args) {
        Collection ct = new ArrayList<>();  // 定义一个 Collection 集合
        ct.add("Java 从入门到精通");
        ct.add("C 语言从入门到精通");
        ct.add("C# 从入门到精通");
        ct.removeIf(e -> ((String)e).length() > 8);
        System.out.println(ct);
    }
}

运行结果如下:

     [C#从入门到精通]

简化集合的运算

例如,定义一个 Collection 集合,向 Collection 集合中添加 “Java从入门到精通”、“C语言从入门到精通”、“C#从入门到精通” 3 个元素后,先输出集合中包含字符串 “C” 的元素的数量,然后输出集合中包含字符串 “Java” 的元素的数量,最后输出集合中的元素字符串长度大于 8 的元素的数量。代码如下:

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

public class Test {
    public static void main(String[] args) {
        Collection ct = new ArrayList<>();  // 定义一个 Collection 集合
        ct.add("Java 从入门到精通");
        ct.add("C 语言从入门到精通");
        ct.add("C# 从入门到精通");
        // 分别输出集合中包含字符串 “C” “Java”,以及长度大于 8 的元素的数量
        System.out.println(calNum(ct, e->((String)e).contains("C")));
        System.out.println(calNum(ct, e->((String)e).contains("Java")));
        System.out.println(calNum(ct, e->((String)e).length() > 8));
    }

    public static int calNum(Collection ct, Predicate pc) {
        int number = 0;
        for(Object obj : ct) {
            // 使用 Predicate 的 test() 方法判断对象是否满足 Predicate 指定的条件
            if (pc.test(obj)) {
                number++;
            }
        }
        return number;
    }
}

运行结果如下:

     2
     1
     2