Java8 List removeIf用法技巧
文章目录
- 字符串切割
- 使用List.removeIf API 剔除元素
- 问题解决
我们在写业务代码时,经常需要截取字符串转成List,然后再通过一个自定义的规则去删减元素。通常使用的是 String.split(",")
的这种方式来切割字符串,然后再用 Arrays.asList(T...)
的方式创建List。然后再去处理List 里面的内容。下面介绍一下1.8 里面存在的坑。
字符串切割
通常我们会使用Arrays.asList(T...)
来生成一个ArrayList。
List<String> compIdList = Arrays.asList(compIds.split(","));
当然也可以借助Guava的API 来进行更强大的处理(Guava的用法不做过多介绍):
List<String> compIdList = Splitter.on(",").trimResults().splitToList(compIds);
使用List.removeIf API 剔除元素
List 创建完之后,看了下开发工具提示了个removeIf()
方法。看了下里面的实现,是1.8 开始提供了,于是就尝了个鲜。在Collection 接口中的实现如下:
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;
}
看上面的代码也没什么问题,于是就使用了。
compIdList.removeIf(tempCompId -> {if (判断逻辑) {return true;}return false;
});
运行之后发现血崩了,结果如下:
java.lang.UnsupportedOperationException: nullat java.util.AbstractList.remove(AbstractList.java:161)at java.util.AbstractList$Itr.remove(AbstractList.java:374)at java.util.Collection.removeIf(Collection.java:415)
问题解决
经过再次查看代码发现,Arrays.asList(T...)
的方式和Guava
的方式 new 出来的类都是静态内部类
。下面以Arrays.asList 为例介绍。
它的 List 实现为:java.util.Arrays.ArrayList
,迭代器实现使用的是继承的 java.util.AbstractList 中的 iterator():
public void remove() {if (lastRet < 0)throw new IllegalStateException();checkForComodification();try {AbstractList.this.remove(lastRet);if (lastRet < cursor)cursor--;lastRet = -1;expectedModCount = modCount;} catch (IndexOutOfBoundsException e) {throw new ConcurrentModificationException();}
}
而 java.util.AbstractList 中的 remove实现如下:
public E remove(int index) {throw new UnsupportedOperationException();
}
意思就是说 AbstractList 的子类只有重写了 remove(int index) 才可以使用 removeIf() 方法
。而上面 2 种 List都没有重写,因此报错。
解决办法也很简单,就是再在外面包一层可变的 java.util.ArrayList 即可。
List<String> compIdList = new ArrayList<>(Arrays.asList(compIds.split(",")));
// 或者
List<String> compIdList = new ArrayList<>(Splitter.on(",").trimResults().splitToList());
链接:http://moguhu.com/article/detail?articleId=112
Java8 List removeIf用法技巧相关推荐
- 关于JS中和||用法技巧
在JavaScript中经常遇到&&和||运算符的使用,下面我们看看它们的用法技巧: &&和||在jQuery源代码内尤为使用广泛,由于本人没有系统的学习js,所以只能 ...
- 一般将来时语法课教案_「英语语法」一般过去时用法技巧全解
大家好,我是教课蚪英语的张老师,今天我们来学习英语语法100讲的第一课,一般过去时! 一.首先我们了解一下什么是一般过去时? 英语语法 1. 概念: 描述过去的状态或过去的动作. 在英语中,非现在的以 ...
- java8 reduce的用法_Java 8系列之Stream中万能的reduce用法说明
reduce 操作可以实现从Stream中生成一个值,其生成的值不是随意的,而是根据指定的计算模型.比如,之前提到count.min和max方法,因为常用而被纳入标准库中.事实上,这些方法都是redu ...
- Java8 Optional类用法
文章目录 API介绍 第一组 Optional(T value) empty() of(T value) ofNullable(T value) 第二组 orElse(T other),orElseG ...
- Java中Split函数的用法技巧
2019独角兽企业重金招聘Python工程师标准>>> 在java.lang包中也有String.split()方法,与.net的类似,都是返回是一个字符型数组,但使用过程中还有一些 ...
- java8函数式编程 视频_快速掌握Java8 Stream函数式编程技巧
函数式编程优势"函数第一位",即函数可以出现在任何地方. 可以把函数作为参数传递给另一个函数,还可以将函数作为返回值. 让代码的逻辑更清晰更优雅. 减少了可变量(Immutable ...
- 微信小程序数据渲染不出来,setData用法技巧全
在开发过程中我们常常发现从后台获取到了数据后(data做出了改变而页面并未加载这些数据).我们先用console.log()把数据输出,确保已经获取到数据,如果已经获取到了那就是下面情况出错了. 未使 ...
- removeIf用法
文章目录 一.引入依赖 二.实体类 1.Persion1 2.Persion 三.测试 四.不想导入依赖的,可以把json相关的内容删除 一.引入依赖 <!-- https://mvnrepos ...
- linux密码叹号,Linux中“!”感叹号用法技巧大全
这篇文章主要给大家介绍了关于Linux中"!"你不知道的惊叹用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习 ...
最新文章
- 给SAP系统安装联机帮助(事务码SR13)
- HDU - 6625 three arrays (Trie+dfs)
- WinDBG 技巧:如何生成Dump 文件(.dump 命令)
- 【nodejs】安装browser-sync 遇到错误提示
- 【动态规划1】动态规划的引入(今天刷洛谷了嘛)
- 在C#中,不安装Oracle客户端如何连接Oracle数据库
- Python学习 第3天 VS与PyCharm使用对比
- Python程序分析
- 让电脑假装蓝屏的C语言,如何自己手动让电脑假装死机
- 100道经典的c语言面试题
- Unity 自定义鼠标指针图标
- 自定义可折叠和展开的View
- Windows2008下安装域控DC及加域
- OP27运放在同相比例放大器中的应用
- 服务器宝塔Error: connect ETIMEDOUT
- 安卓一键新机改串软件的原理是什么
- 大数据能否解决城市所面临的环境问题
- oracle中的dual详解
- 服务器如何防御攻击,有哪些方法
- php的算法是什么,算法是指什么