Java8为Collection集合新增了一个removelf(Predicate filter)方法,该方法将会批量删除符合filter条件的元素。该方法需要一个Predicate(谓词)对象作为参数,Predicate也是函数式接口,因此可以使用Lambda表达式。
如下程序示范了使用Predicate来过滤集合。
package base1;
import java.util.*;
import java.util.function.Predicate;
public class test {
public static void main(String[] args){
Collection books = new HashSet();
books.add("轻量级java EE企业应用实践");
books.add("疯狂java讲义");
books.add("疯狂ios讲义");
books.add("疯狂Ajax讲义");
books.add("疯狂Android讲义");
books.removeIf(ele->((String)ele).length()<10);
System.out.println(books);
}
上面程序调用了Collection集合的removelf(Predicate filter)方法批量删除集合中符合条件的元素,程序传入了一个lambda表达式作为过滤条件:所有长度小于10的字符串元素都会被删除。编译运行代码,可以看到如下输出:
[轻量级java EE企业应用实践, 疯狂Android讲义]
如下程序示范Predicate简化集合的运算。
package base1;
import java.util.*;
import java.util.function.Predicate;
public class test {
public static void main(String[] args){
Collection books = new HashSet();
books.add("轻量级java EE企业应用实践");
books.add("疯狂java讲义");
books.add("疯狂ios讲义");
books.add("疯狂Ajax讲义");
books.add("疯狂Android讲义");
System.out.println(calAll(books,ele->((String)ele).contains("疯狂")));
System.out.println(calAll(books,ele->((String)ele).contains("java")));
System.out.println(calAll(books,ele->((String)ele).length() > 10));
}
private static int calAll(Collection books, Predicate p) {
// TODO Auto-generated method stub
int total = 0;
for(Object obj : books){
if(p.test(obj)){
total++;
}
}
return total;
}
}
运行结果:
4
2
2
该程序有如下三个统计需求:
- 统计书名中出现”疯狂”字符串的图书数量;
- 统计书名中出现”java”字符串的图书数量;
- 统计书名长度大于10的图书数量。