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在Collection中新增加的方法removeIf的更多相关文章
- impala不能查询hive中新增加的表问题
使用Cloudera Manager部署安装的CDH和Impala,Hive中新增加的表,impala中查询不到,其原因是/etc/impala/conf下面没有hadoop和hive相关的 ...
- HTML5中新增加的结构元素、网页元素和全局属性
HTML5新增的结构元素(新增的都是块元素,独占一行) 1) header 定义了文档的头部区域 <header> <h1>网站标题<h1> </header ...
- HTML5中新增加Input 的种类
查询文本框 <input type="search"> 数字文本框 any 代表不设置 <input type="number" max=&q ...
- Array 新增加的一些API用法
es6中新增加了数组的一些用法,基本上是看例子就可以大致明白具体意思. Array.from Array.from方法用于将两类对象转为真正的数组:类似数组的对象和可遍历的对象(包括 ES6 新增的数 ...
- HTML5每日一练之input新增加的六种时间类型应用
今天介绍一下input在HTML5中新增加的时间类型的应用,与昨天的练习一样,如果在以下这几种输入框中输入的格式不正确,也是无法提交的. 注意:此种类型的input在Opera10+中效果为佳,Chr ...
- Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能。
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能. 下面是一个效果图 ...
- 一文带你认识Java8中接口的默认方法
Java8是Oracle于2014年3月发布的一个重要版本,其API在现存的接口上引入了非常多的新方法. 例如,Java8的List接口新增了sort方法.在Java8之前,则每个实现了List接口的 ...
- SQL中那么多函数,Java8为什么还要提供重复的Stream方法,多此一举?
有个同学提出一个这样的疑问; 在业务系统中,数据一般都从sql中查询,类似使用where,order by,limit,聚合函数等,为什么还要用java8的Stream方法? 对这个问题,大家有什么见 ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
随机推荐
- Tomcat常用操作
Tomcat简介 TOMCAT是APACHE JAKARTA软件组织的一个子项目,TOMCAT是一个JSP/SERVLET容器,它是在SUN公司的JSWDK(JAVA SERVER WEB DEVEL ...
- 一个Android上的以滑动揭示的方式显示并切换图片的View
SlideView是一个Android上的以滑动揭示的方式显示并切换图片的View,以视觉对比的方式把一套相似的图片展示出来. 示例 翻页图片揭示效果: 特性 设置一组(List<ImageIn ...
- 使用jQuery的ajax调用action的例子
直接使用ajax请求会比较繁琐,但是jQuery为我们提供了简单使用ajax的方法. 下面是一个在jQuery easyUI中,利用ajax请求,使下拉菜单关联文本框的例子.其中ajax请求就是8-1 ...
- Css3:transform变形
transform 语法: transform 向元素应用 2D 或 3D 转换. transform : none | <<span class="title&quo ...
- mac对比class文件
下载反编译工具 wget https://varaneckas.com/jad/jad158g.mac.intel.zip 设置Beyond Compare 填写编译工具路径
- gb_tree平衡树源码
1.平衡树简称AVL,出名的有红黑树,这里介绍一下gb_tree的实现 gb_tree的原理比红黑树简单,没有过多的旋转跳跃闭着眼,是一种叫AA树的结构(Arne Andersson's Genera ...
- mybatis支持oracle批量插入
问题:mysql使用mybatis批量插入时,通过foreach标签,将每条记录按照逗号","连接即可. 但是,oracle不支持. oracle支持如下写法: <inser ...
- js发展历史
1992年Nombas开发和醋C-minus-minus(c--),的嵌入式脚本语言,最初是绑定在Cenvi软件中,后将其改名scriptEase(客户端执行的语言) Netscape 接受Nomba ...
- android adb shell and monkey 学习记录
Monkey环境: android SDK and JDK SDK目录下的platform-tools和tools目录要配置环境变量 查看版本: ADB 的安装这里就不多说了,输入以下命令有如下提示就 ...
- windows单节点下安装es集群
linux下的es的tar包,拖到windows下,配置后,启动bin目录下的bat文件,也是可以正常运行的. 从linux下拷的tar包,需要修改虚拟机的内存elasticsearch.in.bat ...