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. 夯实Java基础系列4:一文了解final关键字的特性、使用方法,以及实现原理

    目录 final使用 final变量 final修饰基本数据类型变量和引用 final类 final关键字的知识点 final关键字的最佳实践 final的用法 关于空白final final内存分配 ...

  2. 数据结构之二叉树篇卷一 -- 建立二叉树(With Java)

    一.定义二叉树节点类 package tree; public class Node<E> { public E data; public Node<E> lnode; pub ...

  3. (七十八)c#Winform自定义控件-倒影组件

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  4. maven war包打包去除jar包瘦身

    1.pom文件配置 <!-- war包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> ...

  5. Shell之脚本检查与调试

    目录 Shell之脚本检查与调试 参考 脚本语法检查 脚本运行调试 Shell之脚本检查与调试

  6. Centos6 日常使用小结

    网络配置目录 1./etc/sysconfig/network-script/ifcfg-eth0 2.netstat -rn Kernel IP routing table Destination ...

  7. 一步一步剖析Dictionary实现原理

    本文是对c#中Dictionary内部实现原理进行简单的剖析.如有表述错误,欢迎指正. 主要对照源码来解析,目前对照源码的版本是.Net Framwork 4.8,源码地址. 1. 关键的字段和Ent ...

  8. 报错com.neenbedankt.android-apt not found如何解决

    apply plugin: 'com.neenbedankt.android-apt' 在moudle中build.gradle文件内有应用此插件,编译时报错 检查Project中build.grad ...

  9. 设计模式----行为型模式之观察者模式(Observer Pattern)

    下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 ...

  10. pycharm导入自己写的包的时候,不能识别模块的解决办法

    今天用写selenium脚本的时候导入自己统计目录下的模块时,出错,明明存在但是报错说模块不存在,找了半天终于找到解决方案,顺便记录一下吧 pycharm不会将当前文件目录自动加入自己的sourse_ ...