`
bo_hai
  • 浏览: 563819 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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

 最后,欢迎各位拍砖。

 

分享到:
评论
1 楼 bo_hai 2019-03-15  
JDK1.8后,解决问题的办法就简单啦:
List<Integer> list = arrays.stream().filter(Objects::nonNull).collect(Collectors.toList());

相关推荐

    DataFrame中去除指定列为空的行方法

    在本文中,我们将讨论在Python的pandas库中操作DataFrame对象,去除指定列为空的行的几种方法。 首先,pandas库是Python中广泛使用的数据分析工具,它提供了一系列的数据结构和数据分析工具。DataFrame是pandas中最...

    Android中的sqlite查询数据时去掉重复值的方法实例

    SQLite 数据库是移动应用程序中常用的数据库管理系统之一,当我们在 Android 中使用 SQLite 进行数据查询时,经常会遇到重复值的问题,下面我们将讨论如何在 Android 中使用 SQLite 查询数据时去掉重复值的方法实例...

    计算某文件夹下的文件数,依据某个后缀名计算文件数,去掉某个后缀名计算文件数

    在Java中,我们可以使用`java.io.File`类的`listFiles()`方法来获取文件夹中的所有文件和子文件夹。如果需要递归遍历子文件夹,可以使用递归函数。以下是一个简单的例子: ```java public static void ...

    中文名称转英文拼音

    Java作为一种广泛使用的编程语言,提供了多种方法来实现这个功能。本篇文章将详细探讨如何在Java中将中文名称转换为英文拼音,并讨论相关的技术点。 首先,Java中的中文转拼音主要依赖于第三方库,因为Java标准库并...

    点击按钮后,出现一个popup

    View popupView = inflater.inflate(R.layout.popup_list, null); PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); ``` 3. ...

    .NET常用的工具类

    1. **字符串操作**:`.NET Framework`中的`System.String`类提供了丰富的静态方法,如`String.IsNullOrEmpty()`用于检查字符串是否为空或null,`String.Trim()`用于去除字符串两端的空白字符,以及`String.Split()`...

    PHP 二维数组和三维数组的过滤

    // 使用array_filter去除null值 $res = array_map(function ($arr) { return array_filter($arr, function ($v) { return $v !== null; }); }, $arr); // 输出过滤后的二维数组 var_dump($res); ``` 在上述代码...

    android九宫格

    在Activity的`onCreate`方法中,你需要在调用`setContentView()`之前添加以下两行代码: ```java this.requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置Activity无标题 this.getWindow().setFlags...

    Android 二级菜单界面

    在这个场景中,我们将深入探讨如何使用ExpandableListView来创建一个二级菜单界面,并结合提供的标签"源码"和"工具"来讨论实际的实现过程。 首先,了解`ExpandableListView`是Android SDK中用于展示可折叠/展开列表...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并在工作中加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...

    C语言程序设计标准教程

     第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。三种方法中说明的boy1,boy2变量都具有图7.1所示的结构。说明了boy1,boy2变量为stu类型后,即可向这两个变量中的各个成员赋值。在...

    《C++String深入详解2.0版》PDF

    `unique` 算法可以用于去除重复的字符,而 `sort` 算法则用于排序字符串中的字符。 **1.5.3 `std::string` 与 `search`** `search` 算法可以在一个字符串中搜索另一个字符串的出现位置。 **1.5.4 `std::string` ...

    spring cloud zuul修改请求url的方法

    在这个场景下,我们要讨论的是如何在Zuul中修改请求URL。 在实际的微服务架构中,我们可能需要对客户端发送的请求进行一些定制化的处理,比如修改请求的URL,以满足特定的业务需求。例如,可能需要在请求到达目标...

    python入门到高级全栈工程师培训 第3期 附课件代码

    11 在子类中调用父类方法 12 super调用父类的方法 13 选择系统作业讲解 第26章 01 学生自主复习 02 分享列表 03 多态 04 封装 05 面向对象概念总结 06 反射 07 反射及动态导入模块 08 类的内置attr属性 09 类内置...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    认真听课、多思考问题、多动手操作、有问题一定要问、多参与讨论、多帮组同学 五、 体系结构 oracle的体系很庞大,要学习它,首先要了解oracle的框架。oracle的框架主要由物理结构、逻辑结构、内存分配、后台进程...

    一步一步学习PHP(8) php 数组

    除了上述方法,PHP还提供了其他数组操作函数,如`count()`用于获取数组元素数量,`array_push()`和`array_pop()`用于在数组末尾添加或移除元素,`array_key_exists()`检查指定键是否存在,`array_merge()`合并数组,...

    5分钟带你快速回顾MySQL基础语法

    表中字段可以有不同类型的约束,如主键(`PRIMARY KEY`)、非空(`NOT NULL`)、外键(`FOREIGN KEY`)和自增(`AUTO_INCREMENT`)。例如,创建一个包含这些约束的`department`表: ```sql CREATE TABLE department...

    php7-internal:PHP7内核剖析

    首先,我们来讨论PHP7中的 Zend 引擎。Zend引擎是PHP的执行引擎,负责解析PHP代码并转化为机器语言。在PHP7中,Zend引擎引入了全新的opcode(操作码)缓存机制,大大减少了代码解析的时间,提高了运行速度。此外,它...

    20177

    11. **反射**:Java反射机制可以在运行时动态获取类的信息,如类名、方法、属性等,并能动态调用方法和修改属性值。 12. **注解(Annotation)**:自Java 5起,注解作为一种元数据,用于向编译器、JVM或工具提供...

Global site tag (gtag.js) - Google Analytics