java 8 Predicate操作Collection集合详解

KLQ 2020-08-26 15:02:12 java常见问答 7122

下面的文章内容是对使用Java 8的Predicate操作Collection集合的一个详细介绍,对这个方面的操作不大熟悉的小伙伴可以通过下面的文章内容来了解一下。

Java 8起为Collection集合新增了一个removeIf(Predicate filter)方法。

removeIf(Predicate filter)方法将会批量删除符合filter条件的所有元素。

removeIf(Predicate filter)方法需要一个Predicate对象作为参数,Predicate也是函数式接口。所以,可以使用Lambda表达式作为参数。

下面是使用Predicate来过滤集合的一个示例:

public class ForeachTest
{
    public static void main(String[] args)
    {
        // 创建一个集合
        Collection objs = new HashSet();
        objs.add(new String("XXX网Java教程"));
        objs.add(new String("XXX网C++教程"));
        objs.add(new String("XXX网C语言教程"));
        objs.add(new String("XXX网Python教程"));
        objs.add(new String("XXX网Go教程"));
        // 使用Lambda表达式(目标类型是Predicate)过滤集合
        objs.removeIf(ele - > ((String) ele)
            .length() < 12);
        System.out.println(objs);
    }
}

在上面的程序当中,第11行代码调用了Collection集合的removeIf()方法批量删除集合中符合条件的元素,程序传入一个Lambda表达式作为过滤条件,所有长度小于12的字符串元素都会被删除。

编译、运行这段代码的话,可以看到以下的输出:

[XXX网Java教程, XXX网Python教程]

使用Predicate能够充分简化集合的运算,假设,依然有上面程序所示的objs集合,假如程序有下面三个统计需求:

统计集合中出现“XXX网”字符串的数量。

统计集合中出现“Java”字符串的数量。

统计集合中出现字符串长度大于12的数量。

这里的话只是一个假设,实际上的话还可能有更多的统计需求,假如,采用的是传统的编程方式来完成这些需求的话,那么就需要执行三次循环,但是,采用Predicate就只需要一个方法就可以了。

下面的程序对这种用法做了示范:

public class ForeachTest2
{
    public static void main(String[] args)
    {
        // 创建一个集合
        Collection objs = new HashSet();
        objs.add(new String("XXX网Java教程"));
        objs.add(new String("XXX网C++教程"));
        objs.add(new String("XXX网C语言教程"));
        objs.add(new String("XXX网Python教程"));
        objs.add(new String("XXX网Go教程"));
        // 统计集合中出现“XXX网”字符串的数量
        System.out.println(calAll(objs, ele - > ((String) ele)
            .contains("XXX网")));
        // 统计集合中出现“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条件的图书。

关于java 8 Predicate操作Collection集合的内容就给你介绍到这里啦,你都清楚了吗?请继续关注奇Q工具网吧,更多java基础知识和java编程常见问题可以为你分享和解答哦。

推荐阅读:

java使用foreach循环遍历Collection集合详解

java使用Lambda表达式遍历Iterator迭代器详解

Iterator是什么?java Iterator遍历Collection集合元素详解