详解java8在Collection中新增加的方法removeIf

 更新时间:2018年01月21日 15:03:52   作者:纪莫  
这篇文章主要介绍了详解java8在Collection中新增加的方法removeIf的相关资料,需要的朋友可以参考下

记得我在以前找工作的经历中,遇到过一个面试官问过我一个很基础的问题。问题是:有一个List中有10个元素,我现在想从中删除3个元素,请问怎么做?我当时也没想,就直接说,List的有自带的remove方法,可以直接使用,他说请详细的说明一下,我说写一个for循环,循环的次数是List的长度,然后在循环里面直接删除掉想要删除的元素就可以了。

当时还想,这么简单的问题也问,面试官说,你回去自己试试就知道了,你看按照你说的那样写会不会报错。然后我就懵了,虽然这是个简单的问题但是日常的编码中,我还真没有注意过这个小细节,然后面试结果可想而知了。

我回去以后自己真的试了一次还真的会报错,原来在遍历的过程中是不对List操作进行修改的,无论是删除和添加,因为如果在遍历中一直向集合中新增加元素,会造成死循环的,还有就是如果在遍历过程中删除元素,会造成数组下表越界等问题。一般的操作方式是通过addAll方法和removeAll方法来实现的功能的。

例如下面的这种

@Test
public void myTestLearnMore()
{
 List<String> testList = new ArrayList<>();
 testList.add("1杨");
 testList.add("1李");
 testList.add("1王");
 testList.add("1张");
 testList.add("2杨");
 testList.add("2孙");
 testList.add("2赵");
 List<String> temAddList = new ArrayList<>();
 for(String test : testList)
 {
  if(test.startsWith("1"))
  {
   temAddList.add(test);
  }
 }
 testList.removeAll(temAddList);
 System.out.println(JSON.toJSONString(testList));
}

打印结果是:[“2杨”,”2孙”,”2赵”]

这才是真正的操作方式。不过今天我要说的其实Java8的新增的集合方法,像上面先创建一个临时集合然后再通过遍历将需要移除的元放到临时集合中,最后再整体从原始集合中删除。这样要写五六行的代码,在java8中用一行代码就可以搞定了。就是下面这行代码:

testList.removeIf(test->test.startsWith("1"));

这句代码的意思是移除符合removeIf参数格式的元素,所以在这行代码后面再打印testList,就不会打印出以1开头的元素了。

这些小细节其实都是在日常的编码过程中积累出来的,遇到的坑多了,以后再写的时候就会注意了,就像是java中在使用equals的时候,从来都是已知的常量放equals前面,防止出现空指针异常,在集合使用lambda表达式的时候,都要通过Objects.nonNull()先判断集合是不是null,在打印对象的时候不要直接调用对象的toString()方法,要将对象传递给Objects的toString方法,这样就算对象是个null也可以打印出来。Objects这个类是java7新增的工具类。

总结

以上所述是小编给大家介绍的java8在Collection中新增加的方法removeIf ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

相关文章

  • Java8中的LocalDateTime和Date一些时间操作方法

    Java8中的LocalDateTime和Date一些时间操作方法

    这篇文章主要介绍了Java8中的LocalDateTime和Date一些时间操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 使用Java实现验证码程序

    使用Java实现验证码程序

    这篇文章主要为大家详细介绍了使用Java实现验证码程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • SpringBoot 整合 Quartz 定时任务框架详解

    SpringBoot 整合 Quartz 定时任务框架详解

    这篇文章主要介绍了SpringBoot整合Quartz定时任务框架详解,Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制
    2022-08-08
  • JAVA设计模式零基础解析之单例模式的八种方式

    JAVA设计模式零基础解析之单例模式的八种方式

    设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性
    2021-10-10
  • springboot+mybatis-plus实现自动建表的示例

    springboot+mybatis-plus实现自动建表的示例

    本文主要介绍了springboot+mybatis-plus实现自动建表的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 深入理解Java 对象和类

    深入理解Java 对象和类

    下面小编就为大家带来一篇深入理解Java 对象和类。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • 这一次搞懂Spring的XML解析原理说明

    这一次搞懂Spring的XML解析原理说明

    这篇文章主要介绍了这一次搞懂Spring的XML解析原理说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • springboot + elasticsearch 实现聚合查询的详细代码

    springboot + elasticsearch 实现聚合查询的详细代码

    文章介绍了如何在Spring Boot 2.2.6中使用Elasticsearch进行聚合查询,重点在于通过API创建索引和映射,而不是使用Spring Data Elasticsearch的自动创建功能,文章还提到在创建映射时,Elasticsearch会自动为keyword类型添加keyword属性,感兴趣的朋友一起看看吧
    2025-02-02
  • Spring框架IOC容器底层原理详解

    Spring框架IOC容器底层原理详解

    在java当中一个类想要使用另一个类的方法,就必须在这个类当中创建这个类的对象,Spring将创建对象的权利给了IOC,在IOC当中创建了ABC三个对象,那么我们我们其他的类只需要调用集合,大大的解决了程序耦合性的问题
    2022-07-07
  • Spring框架中部署log4j.xml的详细步骤

    Spring框架中部署log4j.xml的详细步骤

    Log4j是一个常用的日志记录工具,它可以帮助我们记录应用程序的运行日志并进行灵活的配置,在Spring框架中,我们可以很方便地部署log4j.xml配置文件来管理日志记录,这篇文章主要介绍了Spring框架中部署log4j.xml的详细步骤并提供相应的代码示例,需要的朋友可以参考下
    2023-09-09

最新评论