Java新增的Predicate操作集合

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的图书数量。

你可能感兴趣的:(java,java集合)