java 8 集合方法 removeIf()的示例

作用:

删除集合中符合条件的成员,empty集合也可以,但是null就炸啦。

直接看代码和运行结果

    /**
     * 删除集合中符合条件的成员,empty集合也可以,但是null就炸啦。
     */
    private static void removeIfTest() {
        List<String> list = Lists.newArrayList("1","12","13","14","15","0");
        System.out.println("初始时:"+ list.toString());
        list.removeIf(s -> s.contains("1"));
        System.out.println("过滤完:" + list.toString());
    }

可以看到,代码的运行效果就是把集合里面元素包含“1”的都给删除啦。


下面是咱1.8之前的做法

    /**
     * 咱之前是怎么从集合中过滤掉不要的元素的
     */
    private static void beforeRemove() {
        List<String> list = Lists.newArrayList("1", "12", "13", "14", "15", "0");
        System.out.println("初始时:" + list.toString());

        System.out.println("for i 循环删除元素");
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).contains("1")) {
                list.remove(i);
                //一般之前这么操作集合的时候,估计都是会忘记 i-- 的
                i--;
            }
        }
        System.out.println("过滤完:" + list.toString());

        System.out.println("Iterator 迭代器 循环删除元素");
        list = Lists.newArrayList("1", "12", "13", "14", "15", "0");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            if (iterator.next().contains("1")) {
                iterator.remove();
            }
        }
        System.out.println("过滤完:" + list.toString());
        System.out.println("加强 for 循环  循环删除元素,直接异常。");
        list = Lists.newArrayList("1", "12", "13", "14", "15", "0");
        for (String s : list) {
            if (s.contains("1")) {
                list.remove(s);
            }
        }
        System.out.println("过滤完:" + list.toString());
    }

运行的结果如下:



最后,看看源码,多说一丢丢。

直接点击,跳转到源码位置,发现如下;

    default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }

逻辑很简单,但是,我要说的,你不一定就知道哟。

首先,这个方法是在  Collection  这个接口 里面的,接口哟,interface哟。不是 class。不是抽象类是接口

还有就是这个方法的修饰,没有常见的 public private  protect,没有,因为接口不写,默认就是 public 的吧。

这个地方使用的是 default 修饰的。

这个default,只是提供默认的方法实现,但是,这个接口的实现类是可以覆盖这个方法的

对,所以,上面我的代码里面,使用的是arraylist,所以,这个方法在arraylist类里面被覆盖啦。

所以,你调用的不一定就是这个Collection里面的这个方法


还有,就是说,咱总结东西,不是说非得系统的去学习总结,老铁们可不会系统的去搜索啊,都是遇到啦,才会去搜索一下的。

谁能一下子把jdk 1.8的东西一篇文章讲完。

不可能的

所以,还是遇到一个方法,总结一点,慢慢的,就总结的差不多啦。jdk 1.8 也就使用的差不多啦,虽然现在1.8已经老啦,不算是啥新鲜东西啦。但是,还是很多人,没有大面积使用的。


真的是最后啦。

我写完文章,给自己点个赞,不过分吧,
不过分,那我可就点啦啊。
我先点为敬,你们随意。大家随意。不要客气。。。


猜你喜欢

转载自blog.csdn.net/qq_27093465/article/details/79154566
今日推荐