List 中去除 null 方法讨论
先看下面的程序段:
public static void main(String[] args) {
List<Integer> arrays = new ArrayList<Integer>();
arrays.add(2);
arrays.add(null);
arrays.add(456);
arrays.add(null);
arrays.add(789);
System.out.println(arrays);
}
注:一个list,向其中插入数据时,也插入一些null。程序输出如下:
[2, null, 456, null, 789]
现在有这个需求:去除list中null 元素。尝试的代码如下:
public static void main(String[] args) {
List<Integer> arrays = new ArrayList<Integer>();
arrays.add(2);
arrays.add(null);
arrays.add(456);
arrays.add(null);
arrays.add(789);
arrays.remove(null);
System.out.println(arrays);
}
调用remove(object)方法,程序的输出如下:
[2, 456, null, 789]
可以看出:只remove了第一个null元素。这不是我们期望的结果。继续找方法。考虑到有一个removeAll(Collection<?> c) ,尝试使用。代码如下:
public static void main(String[] args) {
List<Integer> arrays = new ArrayList<Integer>();
arrays.add(2);
arrays.add(null);
arrays.add(456);
arrays.add(null);
arrays.add(789);
List<Integer> nullArr = new ArrayList<Integer>();
nullArr.add(null);
arrays.removeAll(nullArr);
System.out.println(arrays);
}
程序的输出如下:
[2, 456, 789]
这是我们期望的结果。你可能会尝试下面这样使用:
arrays.removeAll(null);
很遗憾,程序出错了:Exception in thread "main" java.lang.NullPointerException。
到这里,我们似乎找到了解决问题的办法。但是,如果我们的系统中,有这种类型的List<E>,如List<TempProductDto>、List<merchantDto> 时,
我们要从这些List中移除掉null,就要创建如下的代码:
List<TempProductDto> nullTempProd = new ArrayList<TempProductDto>(1);
nullTempProd.add(null); List<MerchantDto> nullMerchant = new ArrayList<MerchantDto>(1);
nullMerchant.add(null);
每种类型,就要创建对应类型的List,并把null 放入到List中。是不是很麻烦。能不能写个公用的Util类呢?以下是我写的Util 类:
import java.io.Serializable;
import java.util.AbstractList;
import java.util.RandomAccess; public class NullCollection extends AbstractList<Object>
implements RandomAccess, Serializable { private static final long serialVersionUID = 5206887786441397812L; @Override
public Object get(int index) {
return null;
} @Override
public int size() {
return 1;
} public boolean contains(Object obj) {
return null == obj;
} private Object readResolve() {
return null;
}
}
import java.util.Collection;
import java.util.List; public class YHDCollectionUtils { public static final Collection NULL_COLLECTION = new NullCollection(); public static final <T> Collection<T> nullCollection() {
return (List<T>) NULL_COLLECTION;
}
}
使用我写的util类进行测试。代码如下:
public static void main(String[] args) {
List<Integer> arrays = new ArrayList<Integer>();
arrays.add(2);
arrays.add(null);
arrays.add(456);
arrays.add(null);
arrays.add(789);
arrays.removeAll(YHDCollectionUtils.nullCollection());
System.out.println(arrays);
}
执行结果如下:
[2, 456, 789]
Util 类可以成功的去除List中的null元素。
也许你会问:为什么要把null放入List中,只有2B青年会这么干?在一般业务中,我们确实不需要把null放入List中,但有一种场景:
从页面封装的List,如下面的代码:
<input name="dto.productList[0].name" value="我是名称1">
<input name="dto.productList[0].price" value="我是价格1"> <input name="dto.productList[2].name" value="我是名称2">
<input name="dto.productList[2].price" value="我是价格2"> <input name="dto.productList[4].name" value="我是名称3">
<input name="dto.productList[4].price" value="我是价格3">
OGNL 会自动把dto.productList[1]、dto.productList[3] 的object封装成null。因此,我们在操作dto.productList 前,优先把 productList 中null去除掉,防止 null 引起的空指针异常。
最后,欢迎各位拍砖。
List 中去除 null 方法讨论的更多相关文章
- vb中的null.nothing.empty区别
以下内容源自互联网: 变量 A.B.C.D 分别等于 0."".Null. Empty. Nothing 的哪一个? Dim A Dim B As String Dim C As ...
- PHP中去除字符串中的换行的方法
在PHP中,有时候我们需要对字符串的换行进行过滤,比如天涯PHP博客中文章页面的description信息,我是直接截取的文章内容,并过滤掉html符号,最终还要过滤掉其中的换行.下面整理一下常见的去 ...
- dedecms中去除首页index.html的方法
本文介绍了dedecms中去除首页index.html的方法,有需要的朋友参考下. dedecms织梦cms建站程序输入地址后,而打开的实际地址后面有个index.html. 这里分享下两种解决方 ...
- Python关于去除字符串中空格的方法
Python关于去除字符串中空格的方法 在编写程序时我们经常会遇到需要将字符串中的空格去掉的情况,通常我们可以使用下面几种解决方法: 1.strip()方法:该方法只能把字符串头和尾的空格去掉,但是不 ...
- python 中去除空格的方法
python 中去除空格的方法: def trim(s): l=[] for i in s: if i!=' ': l.append(i) return ''.join(l) 其中可以使用下面的 '' ...
- Python中去除字符串中的单个或多个空格的方法总结
python中去除字符串中空格的方法比较多,单个看起来也都比较简单 但是使用起来容易发生混淆 为了加深记忆 将常用的去除字符串中空格的方法汇总如下 方法一:strip()方法 >>> ...
- JavaScript中的面向对象的讨论(转)
前言 今天,WEB2.0时代的到来,给了JavaScript又一次大展身手的机会.Web2.0借助JavaScript技术,使得客户端的Web体验更加丰富多彩,同时JavaScript面对的问题域也变 ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- 如何在Java中避免equals方法的隐藏陷阱
摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...
随机推荐
- 【转】【Python学习】之哪些 Python 库让你相见恨晚?
感谢作者:赖明星 文章链接地址:<哪些 Python 库让你相见恨晚?>
- push推送服务设计
PUSH系统架构设计简述 一.网络传输协议的选择 PUSH系统协议选取: UDP协议实时性更好,但是如何处理安全可靠的传输并且处理不同客户端之间的消息交互是个难题,实现起来过于复杂,那就非TCP协议莫 ...
- Linux4_文件操作
以下操作都是在终端命令行: 1 apt-get install 应用名称,(---:apt-get是从Ubuntu的软件应用里自动下载) 如果你不知道下载,随便输入:java,javac,tree ...
- usermod命令
usermod 功能: 修改用户 常用参数:-c 账号说明-d 账号家目录-e 密码失效日期-g 主用户组GID-G 次用户组GID-l 账号名称-s she ...
- ubuntu 及 postgredql 安装配置小坑摘录
ubuntu 16.04.1 安装 Ubuntu Server 16.04.1安装配置图解教程,按教程修改局域网static IP 开启sftp必须 解决SSH服务拒绝密码,之后才能欢乐地使用file ...
- 表转List泛型数组
转换那块怕忘记,留存一下 using System; using System.Collections.Generic; using System.Data; using System.Linq; u ...
- C语言基础知识【函数】
C 函数1.函数是一组一起执行一个任务的语句.每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数.您可以把代码划分到不同的函数中.如何划分代码到不同的函数 ...
- 【BZOJ3707】圈地 几何
[BZOJ3707]圈地 Description 2维平面上有n个木桩,黄学长有一次圈地的机会并得到圈到的土地,为了体现他的高风亮节,他要使他圈到的土地面积尽量小.圈地需要圈一个至少3个点的多边形,多 ...
- 爬虫入门【7】Python-文件的读写和JSON
文本文档的读写 最重要的open()方法将返回一个file对象,经常使用的两个参数为open(filename,mode) 其中,filename为file保存的地址,可以是本地地址,相对地址或者绝对 ...
- 不怕慢 就怕站 不怕单线程 不怕 裸露ip
import sys import os import requests import threading from time import sleep from bs4 import Beautif ...