使用Java 8新增的Predicate操作Collection
如下程序示范了使用 Predicate 来过滤。
上面程序中第 11 行代码调用了 Collection 的 removeIf() 方法批量删除中符条件的元素,程序传入一个 Lambda 表达式作为过滤条件。所有长度小于 12 的字符串元素都会被删除。编译、运行这段代码,可以看到如下输出:public class ForeachTest {
public static void main(String[] args) {
// 创建一个
Collection objs = new HashSet();
objs.add(new String("C语言中文网Java教程"));
objs.add(new String("C语言中文网C++教程"));
objs.add(new String("C语言中文网C语言教程"));
objs.add(new String("C语言中文网Python教程"));
objs.add(new String("C语言中文网Go教程"));
// 使用Lambda表达式(目标类型是Predicate)过滤
objs.removeIf(ele -> ((String) ele).length() < 12);
System.out.println(objs);
}
}
[C语言中文网Java教程, C语言中文网Python教程]
使用 Predicate 可以充分简化的运算,假设依然有上面程序所示的 objs ,如果程序有如下三个统计需求:统计现“C语言中文网”字符串的数量。
统计现“Java”字符串的数量。
统计现字符串长度大于 12 的数量。
此处只是一个假设,实际上还可能有更多的统计需求。如果采用传统的编程方式来完成这些需求,则需要执行三次循环,但采用 Predicate 只需要一个方法即可。下面代码示范了这种用法。
public class ForeachTest2 {
public static void main(String[] args) {
// 创建一个
Collection objs = new HashSet();
objs.add(new String("C语言中文网Java教程"));
objs.add(new String("C语言中文网C++教程"));
objs.add(new String("C语言中文网C语言教程"));
objs.add(new String("C语言中文网Python教程"));
objs.add(new String("C语言中文网Go教程"));
// 统计现“C语言中文网”字符串的数量
System.out.println(calAll(objs, ele -> ((String) ele).contains("C语言中文网")));
// 统计现“Java”字符串的数量
System.out.println(calAll(objs, ele -> ((String) ele).contains("Java")));
// 统计现字符串长度大于 12 的数量
System.out.println(calAll(objs, ele -> ((String) ele).length() > 12));
}
public static int calAll(Collection books, Predicate p) {
int total = 0;
for (Object obj : books) {
// 使用Predicate的test()方法判断该对象是否满足Predicate指定的条件
if (p.test(obj)) {
total++;
}
}
return total;
}
}
输出结果为:
5 1 1
上面程序先定义了一个 calAll() 方法,它使用 Predicate 判断每个元素是否符特定条件,条件将通过 Predicate 参数动态传入。从上面程序中第 11、13、15 行代码可以看到,程序传入了 3 个 Lambda 表达式,其目标类型都是 Predicate,这样 calAll() 方法就只会统计满足 Predicate 条件的图书。