Java Predicate过滤集合(附带实例)
Java 8 为 Collection 集合新增的一个方法:removeIf(Predicate filter),该方法将会批量删除符合 filter 条件的所有元素。
Predicate 是一种谓词动作接口,也就是一个函数式接口,它可以关联一个具体的方法。通过这个方法可以对集合元素进行过滤操作。在 Java 程序中可使用 Lambda 表达式构建 Predicate 接口对象。
接下来,通过案例来演示 removeIf(Predicate filter) 方法的用法:
通过上面的案例可以了解到 Predicate 的好处,除此之外,在使用 Predicate 时还可以充分简化集合的运算。以 List 集合为例,假设程序有如下 3 个统计需求:
此处所做的也只是一个假设,在实际开发过程中还可能有更多的统计需求。如果还是采用传统的编程方式来完成这些需求,则需要执行 3 次循环,但是采用 Predicate 方式只需要调用一下方法即可,例如:
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 个统计需求:
- 在集合中统计出现“AAA”字符串的数量;
- 在集合中统计出现“Java”字符串的数量;
- 在集合中统计出现长度大于12的字符串的数量。
此处所做的也只是一个假设,在实际开发过程中还可能有更多的统计需求。如果还是采用传统的编程方式来完成这些需求,则需要执行 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