先看下面的程序段:

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 方法讨论的更多相关文章

  1. vb中的null.nothing.empty区别

    以下内容源自互联网: 变量 A.B.C.D 分别等于 0."".Null. Empty. Nothing 的哪一个? Dim A Dim B As String Dim C As ...

  2. PHP中去除字符串中的换行的方法

    在PHP中,有时候我们需要对字符串的换行进行过滤,比如天涯PHP博客中文章页面的description信息,我是直接截取的文章内容,并过滤掉html符号,最终还要过滤掉其中的换行.下面整理一下常见的去 ...

  3. dedecms中去除首页index.html的方法

    本文介绍了dedecms中去除首页index.html的方法,有需要的朋友参考下. dedecms织梦cms建站程序输入地址后,而打开的实际地址后面有个index.html.   这里分享下两种解决方 ...

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

    Python关于去除字符串中空格的方法 在编写程序时我们经常会遇到需要将字符串中的空格去掉的情况,通常我们可以使用下面几种解决方法: 1.strip()方法:该方法只能把字符串头和尾的空格去掉,但是不 ...

  5. python 中去除空格的方法

    python 中去除空格的方法: def trim(s): l=[] for i in s: if i!=' ': l.append(i) return ''.join(l) 其中可以使用下面的 '' ...

  6. Python中去除字符串中的单个或多个空格的方法总结

    python中去除字符串中空格的方法比较多,单个看起来也都比较简单 但是使用起来容易发生混淆 为了加深记忆 将常用的去除字符串中空格的方法汇总如下 方法一:strip()方法 >>> ...

  7. JavaScript中的面向对象的讨论(转)

    前言 今天,WEB2.0时代的到来,给了JavaScript又一次大展身手的机会.Web2.0借助JavaScript技术,使得客户端的Web体验更加丰富多彩,同时JavaScript面对的问题域也变 ...

  8. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  9. 如何在Java中避免equals方法的隐藏陷阱

    摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...

随机推荐

  1. iOS系列译文:自定义Collection View布局

    原文出处: Ole Begemann   译文出处: 黄爱武(@answer-huang).欢迎加入技术翻译小组. UICollectionView在iOS6中第一次被介绍,也是UIKit视图类中的一 ...

  2. Markdown GUI编辑器推荐 windows mac

    windows 1. MarkdownPad 如果右边不能预览: LivePreview is not working - it displays an error message stating T ...

  3. IntelliJ idea——》删除tag

    查看git上所有tag E:\eju_IdeaProjects\house-platform>git tag --11v1. 20181107周三上线 20181120周二上线 v1.0.0 v ...

  4. android中实现毛笔效果(View 中画图)

    近期有一个项目设计一个APP实现通过触摸屏实现毛笔写字效果.传统的绘画板程序直接通过Path的moveTo和LineTo便可实现简单的线条绘画程序.然而要达到毛笔的笔锋效果则须要更为具体点的设计.我的 ...

  5. WPF 员工卡条形码

    大家都知道条形码(Barcode)是一种可以由机器识别的特殊编码,在生产.生活中也常常会见到并使用它.条形码的类型和种类很多感兴趣的朋友可以详细了解一下.其中Code 39 可以说是一种最为常见并广泛 ...

  6. android-support-v4.jar异常解决方法

    1.当一个项目引入其他library项目时,会出现android-support-v4.jar冲突问题: 解决:将library项目中的android-support-v4.jar更新到最新,方法右键 ...

  7. 【BZOJ3640】JC的小苹果 概率DP+高斯消元

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...

  8. centos7 PXE自动安装环境搭建

    原理: 要进行自动安装的主机A,加电启动时以网卡为第一启动设备 1.启动时会向网络广播,找到dhcp服务器B请求分配IP地址信息,服务器B除了给其分配基本的IP信息(ip.netmask.getewa ...

  9. Residual (numerical analysis)

    In many cases, the smallness of the residual means that the approximation is close to the solution, ...

  10. 算法设计 mac 字符串 标识 n维度 2 3维度 字符串 标识值 特征值

    基向量