【Java必修课】四类方法删除List里面的所有null值
1 简介
万恶的null
已经折磨程序员许久了,也带来了许多难以发现却造成严重损失的NullPointerException
。我们需要尽可能的避免它,有一种简单的办法就是在它进入下轮处理前,我们就把它扼杀在摇篮里。
本文介绍了四类方法,分别是List
接口的方法、Stream
、Guava
和Apache 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值的更多相关文章
- 【Java必修课】通过Value获取Map中的键值Key的四种方法
1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...
- Java实验四
20145113 Java实验四 快捷键 之前没怎么记ISDEA的快捷键,但是熟练使用快捷键可以带来很多的便利,于是先开始学习一些常用的快捷键,就采用它默认的快捷键,这样后期就不会出现冲突,一些and ...
- java web(四)文件上传与下载
一.文件上传原理 1.在TCP/IP中,最早出现的文件上传机制是FTP ,它是将文件由客户端发送到服务器的标准机制:但是在jsp使用过程中不能使用FTP方法上传文件,这是由jsp运行机制所决定. 通 ...
- java中四种引用类型
java中四种引用类型 今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在 ...
- Java基础:Java的四种引用
在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...
- 转载:Java的四种引用方式
原文:https://www.cnblogs.com/huajiezh/p/5835618.html Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指 ...
- Java的四种引用类型之弱引用
先说结论: 首先,Java中有四种引用类型:强引用.软引用.弱引用.虚引用.-- 在 Java 1.2 中添加的,见 package java.lang.ref; . 其次,这几个概念是与垃圾回收有关 ...
- Java的四种内部类
Java的四种内部类包括如下: 成员内部类 静态内部类 局部内部类 匿名内部类 成员内部类: 定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,......相当于外部类的非静态方法 ...
- Java中四种引用:强、软、弱、虚引用
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
随机推荐
- linux下安装node.js时npm无法使用
安装node.js 10.15.1版本时,安装完在node的安装目录下执行./node -v查看node版本,成功则表示node已安装成功 [root@localhost bin]# ./node - ...
- dom4j.jar下载
下载地址: 链接:https://pan.baidu.com/s/16GCgCpaF7dc33pMbK2sTLg 密码:z444
- JVM 调优 - jhat
Java命令学习系列(五)——jhat 2016-01-21 分类:Java 阅读(8708) 评论(3) 阿里大牛珍藏架构资料,点击链接免费获取 jhat(Java Heap Analysis To ...
- Hadoop点滴-HDFS命令行接口
1.-help[cmd] 显示命令的帮助信息 ./hdfs dfs -help ls1 2.-ls(r) 显示当前目录下的所有文件 -R层层循出文件夹 ./hdfs dfs -ls /log/map ...
- redis分布式锁-自动超时锁(在用)
1.加锁代码结构 2.解锁代码结构 3.java实例 4.测试类 5.测试日志 加锁代码结构 def acquire_lock_with_timeout(conn,lockname,acquire_t ...
- mybatis - 通用mapper
title: 玩转spring-boot-mybatis date: 2019-03-11 19:36:57 type: "mybatis" categories: mybatis ...
- 利用CSS制作图形效果
前言 关于如何使用CSS来制作图形,比如说圆形,半圆形,三角形等的相关教程还是挺多的,今天我主要想解释一下里面一些demo的实现原理,话不多说,开始吧 以下所有内容只使用一个HTML元素.任何类型 ...
- spring源码分析系列2:Bean与BeanDefinition关系
接口表示一种能力,实现了一个接口,即拥有一种能力. BeanDefinition与Bean的关系, 就好比类与对象的关系. 类在spring的数据结构就是BeanDefinition.根据BeanDe ...
- Thinkphp5.0第四篇
删除数据 当前模型删除 $user=UserModel::get(1); if($user->delete()){return '删除成功';} else{return '删除失败';} 根据主 ...
- Android 总结:ContentProvider 的使用
一.概述 ContentProvider:为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据. Android内置的许多数据都是使用ContentProvider形式,供开发者调用的 ( ...