作用:

删除集合中符合条件的成员,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已经老啦,不算是啥新鲜东西啦。但是,还是很多人,没有大面积使用的。

真的是最后啦。

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


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java代码实现计算2个日期时间相差几年几月几天,用的jdk1.8知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。