1 简介

万恶的null已经折磨程序员许久了,也带来了许多难以发现却造成严重损失的NullPointerException。我们需要尽可能的避免它,有一种简单的办法就是在它进入下轮处理前,我们就把它扼杀在摇篮里。

本文介绍了四类方法,分别是List接口的方法、StreamGuavaApache Commons Collections来删除一个List里面的null值。希望读者可以举一反三,得到更多启发。

2 四类方法

2.1 List自带的方法

List有许多remove的方法可以使用,以下三个都可以满足我们的需求:

  • List.remove(Object o):删除一个元素,成功则返回true;需要注意它只删除一个;
  • List.removeAll(Collection<?> c):删除存在集合c的所有情况,注意入参不是一个元素;
  • List.removeIf(Predicate<? super E> filter):删除所有满足条件的元素,入参为Lambda表达式。

代码如下:

@Test
public void listRemove() {
List<String> list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
List<String> expected = Lists.newArrayList("Cup", "Apple", "Desk");
//remove
while (list.remove(null));//巧妙利用循环删除
assertEquals(expected, list);
//removeAll
list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
list.removeAll(Collections.singletonList(null));
assertEquals(expected, list);
//removeIf
list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
list.removeIf(Objects::isNull);
assertEquals(expected, list);
}

2.2 Stream的方式

Stream的方法很容易理解,就是加一个过滤器即可,过滤条件为非空,具体代码如下:

@Test
public void stream() {
List<String> list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
List<String> expected = Lists.newArrayList("Cup", "Apple", "Desk");
List<String> result = list.parallelStream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
assertEquals(expected, result);
}

2.3 使用Guava库

Guava是非常优秀的Java库,提供了许多优秀的处理集合类的方法,本次使用了Iterables类进行处理,代码如下:

@Test
public void guava() {
//改变原有List
List<String> list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
List<String> expected = Lists.newArrayList("Cup", "Apple", "Desk");
Iterables.removeIf(list, Objects::isNull);
assertEquals(expected, list);
//保留原有List
list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
List<String> result = Lists.newArrayList(Iterables.filter(list, Objects::nonNull));
assertEquals(expected, result);
}

本文提供两种方法,一种会改变原有的List,另一种则不会。

2.4 使用Apache Commons的库

Apache Commons Collections也提供了很方便的方法,具体代码如下:

@Test
public void apacheCommonsCollections() {
List<String> list = Lists.newArrayList("Cup", null, "Apple", null, "Desk");
List<String> expected = Lists.newArrayList("Cup", "Apple", "Desk");
CollectionUtils.filter(list, Objects::nonNull);
assertEquals(expected, list);
}

3 总结

虽然本文讲的是List删除null的方法,但稍加修改,就可以扩展到集合类删除特定条件的值,这还是非常有用的。


欢迎关注公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写作,多整理。

【Java必修课】四类方法删除List里面的所有null值的更多相关文章

  1. 【Java必修课】通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

  2. Java实验四

    20145113 Java实验四 快捷键 之前没怎么记ISDEA的快捷键,但是熟练使用快捷键可以带来很多的便利,于是先开始学习一些常用的快捷键,就采用它默认的快捷键,这样后期就不会出现冲突,一些and ...

  3. java web(四)文件上传与下载

     一.文件上传原理 1.在TCP/IP中,最早出现的文件上传机制是FTP ,它是将文件由客户端发送到服务器的标准机制:但是在jsp使用过程中不能使用FTP方法上传文件,这是由jsp运行机制所决定. 通 ...

  4. java中四种引用类型

    java中四种引用类型  今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在 ...

  5. Java基础:Java的四种引用

    在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...

  6. 转载:Java的四种引用方式

    原文:https://www.cnblogs.com/huajiezh/p/5835618.html Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指 ...

  7. Java的四种引用类型之弱引用

    先说结论: 首先,Java中有四种引用类型:强引用.软引用.弱引用.虚引用.-- 在 Java 1.2 中添加的,见 package java.lang.ref; . 其次,这几个概念是与垃圾回收有关 ...

  8. Java的四种内部类

    Java的四种内部类包括如下: 成员内部类 静态内部类 局部内部类 匿名内部类 成员内部类: 定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,......相当于外部类的非静态方法 ...

  9. Java中四种引用:强、软、弱、虚引用

    这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...

随机推荐

  1. 检查图片是否损坏、图片后缀是否与实际图片类型对应 - Python

    图片工具 检查图片是否损坏 日常工作中,时常会需要用到图片,有时候图片在下载.解压过程中会损坏,而如果一张一张点击来检查就太不Cool了,因此我想大家都需要一个检查脚本: 测试图片,0.jpg是正常的 ...

  2. java ThreadLocal使用

    1.源码分析 此处以JDK1.8版本分析 1.1 set方法 /** * Sets the current thread's copy of this thread-local variable * ...

  3. Maven中jar包冲突的解决方式

    现象 创建一个maven工程,引入spring-context包. <dependency> <groupId>org.springframework</groupId& ...

  4. CentOS系统查看软件安装路径

    Linux系统一般都是命令行界面,对于安装的软件也是通过命令安装的.对于软件包更新和卸载等有时候需要查看检查是否有改软件,软件安装存储的路径对于修改配置文件等是必要的.那么怎么查看软件安装路径呢?小编 ...

  5. 利用CSS制作图形效果

    前言 关于如何使用CSS来制作图形,比如说圆形,半圆形,三角形等的相关教程还是挺多的,今天我主要想解释一下里面一些demo的实现原理,话不多说,开始吧   以下所有内容只使用一个HTML元素.任何类型 ...

  6. 关于CSS的书写规范和顺序

    关于CSS的书写规范和顺序,是大部分前端er都必须要攻克的一门关卡,如果没有按照良好的CSS书写规范来写CSS代码,会影响代码的阅读体验.这里总结了一个CSS书写规范.CSS书写顺序供大家参考,这些是 ...

  7. FFmpeg(二) 解封装相关函数理解

    一.解封装基本流程 ①av_register_All()////初始化解封装,注册解析和封装的格式. ②avformat_netword_init()//初始化网络,解析rtsp协议 ③avforma ...

  8. charles抓包小程序

    charles抓包小程序: 原理呢,简单理解,通过charles开代理,然后手工wifi设置代理上网. 但是要做一些准备:手机要安装charles 证书. 注意的是安卓和ios有区别:目前安卓7.0版 ...

  9. .Net Core删除ClientApp目录,重新生成报错解决办法

    因为在老的项目上做修改,需要删除单独的spa目录,就把ClientApp删掉了.但是重新生成报错,在VS2017界面上也没找到在什么地方配置.最后发现在csproj上里面可以去掉spa的配置 < ...

  10. Bitmap简介

    1.  BitMap Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省.(PS:划重点 ...