文章目录

  • 字符串切割
  • 使用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用法技巧相关推荐

  1. 关于JS中和||用法技巧

    在JavaScript中经常遇到&&和||运算符的使用,下面我们看看它们的用法技巧: &&和||在jQuery源代码内尤为使用广泛,由于本人没有系统的学习js,所以只能 ...

  2. 一般将来时语法课教案_「英语语法」一般过去时用法技巧全解

    大家好,我是教课蚪英语的张老师,今天我们来学习英语语法100讲的第一课,一般过去时! 一.首先我们了解一下什么是一般过去时? 英语语法 1. 概念: 描述过去的状态或过去的动作. 在英语中,非现在的以 ...

  3. java8 reduce的用法_Java 8系列之Stream中万能的reduce用法说明

    reduce 操作可以实现从Stream中生成一个值,其生成的值不是随意的,而是根据指定的计算模型.比如,之前提到count.min和max方法,因为常用而被纳入标准库中.事实上,这些方法都是redu ...

  4. Java8 Optional类用法

    文章目录 API介绍 第一组 Optional(T value) empty() of(T value) ofNullable(T value) 第二组 orElse(T other),orElseG ...

  5. Java中Split函数的用法技巧

    2019独角兽企业重金招聘Python工程师标准>>> 在java.lang包中也有String.split()方法,与.net的类似,都是返回是一个字符型数组,但使用过程中还有一些 ...

  6. java8函数式编程 视频_快速掌握Java8 Stream函数式编程技巧

    函数式编程优势"函数第一位",即函数可以出现在任何地方. 可以把函数作为参数传递给另一个函数,还可以将函数作为返回值. 让代码的逻辑更清晰更优雅. 减少了可变量(Immutable ...

  7. 微信小程序数据渲染不出来,setData用法技巧全

    在开发过程中我们常常发现从后台获取到了数据后(data做出了改变而页面并未加载这些数据).我们先用console.log()把数据输出,确保已经获取到数据,如果已经获取到了那就是下面情况出错了. 未使 ...

  8. removeIf用法

    文章目录 一.引入依赖 二.实体类 1.Persion1 2.Persion 三.测试 四.不想导入依赖的,可以把json相关的内容删除 一.引入依赖 <!-- https://mvnrepos ...

  9. linux密码叹号,Linux中“!”感叹号用法技巧大全

    这篇文章主要给大家介绍了关于Linux中"!"你不知道的惊叹用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习 ...

最新文章

  1. 给SAP系统安装联机帮助(事务码SR13)
  2. HDU - 6625 three arrays (Trie+dfs)
  3. WinDBG 技巧:如何生成Dump 文件(.dump 命令)
  4. 【nodejs】安装browser-sync 遇到错误提示
  5. 【动态规划1】动态规划的引入(今天刷洛谷了嘛)
  6. 在C#中,不安装Oracle客户端如何连接Oracle数据库
  7. Python学习 第3天 VS与PyCharm使用对比
  8. Python程序分析
  9. 让电脑假装蓝屏的C语言,如何自己手动让电脑假装死机
  10. 100道经典的c语言面试题
  11. Unity 自定义鼠标指针图标
  12. 自定义可折叠和展开的View
  13. Windows2008下安装域控DC及加域
  14. OP27运放在同相比例放大器中的应用
  15. 服务器宝塔Error: connect ETIMEDOUT
  16. 安卓一键新机改串软件的原理是什么
  17. 大数据能否解决城市所面临的环境问题
  18. oracle中的dual详解
  19. 服务器如何防御攻击,有哪些方法
  20. php的算法是什么,算法是指什么

热门文章

  1. 你知道linux的复制命令吗?cp
  2. jmeter 内java生成HMACSHA256的方法
  3. 【Python】Webpy 源码学习(转)
  4. 安全左移理念,腾讯DevSecOps如何实践?
  5. linux 输入法框架,常用输入法框架简介 - 微信公众号:算法与编程之美 - OSCHINA - 中文开源技术交流社区...
  6. android实现手机端控制电脑PPT播放的APP(一)
  7. 占失物:花露水在哪里
  8. WebGIS开发杂谈(一)——基于ArcGIS构建WebGIS概述
  9. 地铁调色,打造金属质感
  10. TCP滑动窗口模拟实战