Java8 为 Collection 集合新增了一个removeIf(Predicate filter )方法,该方法可以批量删除filter条件的所有元素。该方法的参数 Predicate是函数式接口,因此可以使用lamabda表达式作为参数。
示范一:使用Predicate来过滤集合
Collection books=new HashSet();
books.add("JAVA从入门到倒插门");
books.add("android从入门到深大北门");
books.add("苹果种植技术");
books.add("MYSQL从入门到跑路");
books.add("如何搭讪");
books.removeIf(obj -> ( (String)obj).length() <10 );
System.out.println(books);
该代码片段将通过removeIf 方法批量删除 满足条件 长度小于10的元素 ,运行输出结果如下:
[MYSQL从入门到跑路, android从入门到深大北门, JAVA从入门到倒插门]
此外,使用Predicate 还可以充分简化集合运算,假如程序有如下三个统计需求:
1,统计书中出现”入门“字符串的书籍;
2,统计书中出现“JAVA”字符串的书籍;
3,统计名字长度大于10的书籍;
如果采用传统的编程方式完成这个需求,可能需要执行三次循环,但采用Predicate只需要一个方法即可 ,代码如下:
public class Test {
public static void main(String[] args) throws FileNotFoundException {
Collection books=new HashSet();
books.add("JAVA从入门到倒插门");
books.add("android从入门到深大北门");
books.add("苹果种植技术");
books.add("MYSQL从入门到跑路");
books.add("如何搭讪");
System.out.println("书名包含 入门 的书籍数"+calAll(books,ele -> ( (String)ele).contains("入门") ) );
System.out.println("书名包含 JAVA 的书籍数"+calAll(books,ele -> ( (String)ele).contains("JAVA") ) );
System.out.println("书名长度大于10的书籍数"+calAll(books,ele -> ( (String)ele).length() >10 ) );
}
public static int calAll(Collection books,Predicate p){
int total=0;
for(Object o:books){
//使用Predicate判断Object 是否满足条件
if(p.test(o)){
total++;
}
}
return total;
}
}
该程序先定义了一个calAll()方法,该方法将通过使用Preticate判断每个集合元素是否符合特定条件。
运行代码输出结果为:
书名包含 入门 的书籍数3
书名包含 JAVA 的书籍数1
书名长度大于10的书籍数3
另外,Java8中还新增了Stream来操作合集,Collection接口提供了一个stream()默认方法,该方法可以返回该集合对应的流,接下来即可通过流式API来操作集合元素,例如上面的代码,我们可以通过Stream来改写:
public class Test {
public static void main(String[] args) throws FileNotFoundException {
Collection books=new HashSet();
books.add("JAVA从入门到倒插门");
books.add("android从入门到深大北门");
books.add("苹果种植技术");
books.add("MYSQL从入门到跑路");
books.add("如何搭讪");
System.out.println("书名包含 入门 的书籍数"+(books.stream().filter(ele -> ( (String)ele).contains("入门") )).count());
System.out.println("书名包含 JAVA 的书籍数"+(books.stream().filter(ele -> ( (String)ele).contains("JAVA") )).count() );
System.out.println("书名长度大于10的书籍数"+(books.stream().filter(ele -> ( (String)ele).length() >10 )).count() );
//调用Stream的mapToInt()方法获取原有的Stream对应的IntStream
books.stream().mapToInt(ele -> ((String)ele).length())
//调用forEach方法遍历IntStream中的每个元素
.forEach(System.out::println);
}
}
这里通过流式API 取代了自己写得calAll方法,更方便快捷的对元素进行了批量操作。