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) ,尝试使用。代码如下:

一起jquery,17jquery

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);
}  

程序的输出如下:

一起jquery,17jquery

[2, 456, 789]  

这是我们期望的结果。你可能会尝试下面这样使用: 内容来自17jquery

内容来自17jquery

arrays.removeAll(null);  

很遗憾,程序出错了:Exception in thread "main" java.lang.NullPointerException。

内容来自17jquery

   到这里,我们似乎找到了解决问题的办法。但是,如果我们的系统中,有这种类型的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);

 内容来自17jquery 

  每种类型,就要创建对应类型的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类进行测试。代码如下: 内容来自17jquery

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);
}  

执行结果如下:

内容来自17jquery

[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 引起的空指针异常。

  最后,欢迎各位拍砖。

时间: 2024-10-20 03:48:02

List 中去除 null 方法讨论的相关文章

Java中的null对象也可以访问static成员变量和方法

声明:本博客为原创博客,未经允许,不得转载!小伙伴们如果是在别的地方看到的话,建议还是来csdn上看吧(链接为 http://blog.csdn.net/bettarwang/article/details/26515271),看代码和提问.讨论都更方便. 一般来说,一个类的对象要在实例化之后才可以访问类中的成员变量和方法.如果它还是null,通常意义上我们就认为它不能访问类中的成员.实际上确实不提倡这样,而且null对象确实不能访问实例成员(变量和方法),否则会引发NULLPointerExc

Js中去除数组中重复元素的4种方法

今天工作遇到此问题,尝试多个方法不尽人意,故此写个博客来总结一下如何在js中去除重复元素. 方法1:         Array.prototype.method1 = function(){             var arr[];    //定义一个临时数组             for(var i = 0; i < this.length; i++){    //循环遍历当前数组                 //判断当前数组下标为i的元素是否已经保存到临时数组          

在Word中去除超链接的两种方法

本文来自e良师益友网 不少朋友都有这样一个疑问:在Word中输入网站地址,回车之后,先前输入的地址就自动转变为了蓝色的超链接,如果我们不想这样,该如何设置呢?下面,简单的介绍两种方法给大家参考. 方法一:运用自动更正选项 1.启动Word2003,在空白处直接输入网站地址之后,自动变为蓝色的超链接形式,我们仔细发现,首字母下有一道横线,光标移动至此,显示自动更正选项. 2.单击自动更正选项,有三个可供选择的,选择控制自动更正选项. 3.在键入时自动套用格式选项卡中,取消勾选Internet及网络

Python中去除字符串中空格的方法

Python中去除字符串中指定字符或者空格的方法有几种: str.strip() //该方法用于去除字符串开头和结尾的指定字符或字符串(默认为空格或换行符) str.lstrip() //该方法用于截掉字符串左边的空格或指定字符 str.rstrip() //该方法用于截掉字符串右边的空格或指定字符 所以若是要去除字符串中所有的空格可以使用如下方式: str.strip().lstrip.rstrip() 原文地址:https://www.cnblogs.com/EdenChanIy/p/993

Python关于去除字符串中空格的方法

Python关于去除字符串中空格的方法 在编写程序时我们经常会遇到需要将字符串中的空格去掉的情况,通常我们可以使用下面几种解决方法: 1.strip()方法:该方法只能把字符串头和尾的空格去掉,但是不能将字符串中间的空格去掉. s=' This is a demo ' print(s.strip()) lstrip():该方法只能把字符串最左边的空格去掉. s=' ! This is a demo ' l='!' print(s.lstrip()+l) rstrip():该方法只能把字符串最右边

使用Linq中的Distinct方法对序列进行去重操作

使用Linq提供的扩展方法Distinct可以去除序列中的重复元素. 该方法具有以下两种重载形式: (1)public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source) (重载1) 通过使用默认的相等比较器对值进行比较并返回序列中的非重复元素. (2)publicstatic IQueryable<TSource> Distinct<TSour

android 不能在子线程中更新ui的讨论和分析

问题描述 做过android开发基本都遇见过ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改ui,子线程要修改ui只能post到主线程或者使用handler之类.但是仔细看看exception的描述并不是这样的,"Only the original thread that created a view hierarchy can touch its views",只有创建该 view 布局层次的原始线程

cocos2d-x 源码分析 之 CCTableView源码分析(附使用方法讨论)

cocos2d-x源码总目录 http://blog.csdn.net/u011225840/article/details/31743129 源码来自2.x,转载请注明 1.继承结构 首先来看下CCTableView的继承结构 从继承结构上看,CCTableView是一种CCScrollView,所以为了研究CCTableView的源码,清先去了解CCScrollView的源码http://blog.csdn.net/u011225840/article/details/30033501. 其

子查询中的NULL问题

子查询返回有单行,多行和null值:适用于单行子查询的比较运算符是=,>,>=,<,<=<>和!=.适用于多行子查询的比较运算符是in,not in,any和any.在子查询中不可回避的是会返回null值,下面就这个问题来讨论一下. 在单行子查询中 SQL> select last_name,department_id from employees where department_id is null; LAST_NAME DEPARTMENT_ID -----