您的位置:首页 > 编程语言 > Java开发

JAVA8 使用谓词(Predicate)操作集合

2017-07-17 16:42 253 查看

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方法,更方便快捷的对元素进行了批量操作。





阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: