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

Java Predicate过滤集合(附带实例)

Java 8 为 Collection 集合新增的一个方法:removeIf(Predicate filter),该方法将会批量删除符合 filter 条件的所有元素。

Predicate 是一种谓词动作接口,也就是一个函数式接口,它可以关联一个具体的方法。通过这个方法可以对集合元素进行过滤操作。在 Java 程序中可使用 Lambda 表达式构建 Predicate 接口对象。

接下来,通过案例来演示 removeIf(Predicate filter) 方法的用法:
import java.util.*;

public class Demo {
    public static void main(String[] args) {
        List<String> books = new ArrayList<String>();
        books.add("AAAJava基本教程");
        books.add("AAAC语言入门教程");
        books.add("AAAC++基本教程");
        books.add("AAAPython基础教程");
        books.add("AAALinux入门教程");
        books.add("AAAC#基础教程");
        books.removeIf(book -> (book).length() < 12);  // 删除长度小于12的字符串
        System.out.println(books);
    }
}
程序的运行结果如下:

[AAAPython基础教程, AAALinux入门教程]

程序中第 12 行调用了 removeIf() 方法批量删除集合中符合条件的元素,在该方法中传入一个 Lambda 表达式作为过滤条件,所有长度小于 12 的字符串元素都会被删除。

通过上面的案例可以了解到 Predicate 的好处,除此之外,在使用 Predicate 时还可以充分简化集合的运算。以 List 集合为例,假设程序有如下 3 个统计需求:
此处所做的也只是一个假设,在实际开发过程中还可能有更多的统计需求。如果还是采用传统的编程方式来完成这些需求,则需要执行 3 次循环,但是采用 Predicate 方式只需要调用一下方法即可,例如:
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

public class Demo {
    public static void main(String[] args) {
        List<String> books = new ArrayList<String>();
        books.add("AAAJava基本教程");
        books.add("C语言入门教程");
        books.add("AAAC++基本教程");
        books.add("AAAPython基础教程");
        books.add("AAALinux入门教程");
        books.add("AAAC#基础教程");
       
        // 统计集合中出现 "AAA" 字符串的数量
        System.out.println(count(books,
            book -> ((String) book).contains("AAA")));
        // 统计集合中出现 "Java" 字符串的数量
        System.out.println(count(books,
            book -> ((String) book).contains("Java")));
        // 统计集合中出现长度大于12的字符串的数量
        System.out.println(count(books,
            book -> ((String) book).length() > 12));
    }

    public static int count(List<String> books, Predicate predicate) {
        int total = 0;
        for (String book : books) {
            // 使用Predicate的test()方法判断该对象是否满足指定的条件
            if (predicate.test(book)) {
                total++;
            }
        }
        return total;
    }
}
程序的运行结果如下:

5
1
1

程序中定义了一个 count() 方法,它使用 Predicate 来判断每个集合元素是否符合特定条件,条件将通过 Predicate 参数动态传入。从程序中第 17、20、23 行代码可以看到,在方法中传入了 3 个 Lambda 表达式,其目标类型都是 Predicate,这样 count() 方法就只会统计满足 Predicate 条件的对象。

相关文章