使用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