删除List中null的N种方法--最后放大招

2020-05-04 14:23:00 浏览数 (1)

  • List列表中删除null的不同方法:

抛砖引玉,先抛砖,大招在最后。

Java 7或更低版本

当使用Java 7或更低版本时,我们可以使用以下结构从列表中删除所有空值:

代码语言:javascript复制
@Test
public removeNull() {
 
    List<String> list = new ArrayList<>(Arrays.asList("A", null, "B", null));
 
    list.removeAll(Collections.singleton(null));
 
    assertThat(list, hasSize(2));
}
  • 请注意,在此处创建了一个可变列表。尝试从不可变列表中删除null将抛出java.lang.UnsupportedOperationException的错误。

Java 8或更高版本

Java 8或更高版本,从List列表中删除null的方法非常直观且优雅:

代码语言:javascript复制
@Test
public removeNull() {
 
    List<String> list = new ArrayList<>(Arrays.asList("A", null, "B", null));
 
    list.removeIf(Objects::isNull);
 
    assertThat(list, hasSize(2));
}

我们可以简单地使用removeIf()构造来删除所有空值。

如果我们不想更改现有列表,而是返回一个包含所有非空值的新列表,则可以:

代码语言:javascript复制
@Test
public removeNull() {
 
    List<String> list = new ArrayList<>(Arrays.asList("A", null, "B", null));
 
    List<String> newList = list.stream().filter(Objects::nonNull).collect(Collectors.toList());
 
    assertThat(list, hasSize(4));
    assertThat(newList, hasSize(2));
}

Apache Commons

Apache Commons CollectionUtils类提供了一个filter方法,该方法也可以解决我们的目的。传入的谓词将应用于列表中的所有元素:

代码语言:javascript复制
@Test
public removeNull() {
 
    List<String> list = new ArrayList<>(Arrays.asList("A", null, "B", null));
 
    CollectionUtils.filter(list, PredicateUtils.notNullPredicate());
 
    assertThat(list, hasSize(2));
}

Google Guava

Guava中的Iterables类提供了removeIf()方法,以帮助我们根据给定的谓词过滤值。

代码语言:javascript复制
@Test
public removeNull() {
 
    List<String> list = new ArrayList<>(Arrays.asList("A", null, "B", null));
 
    Iterables.removeIf(list, Predicates.isNull());
 
    assertThat(list, hasSize(2));
}

另外,如果我们不想修改现有列表,Guava允许我们创建一个新的列表:

代码语言:javascript复制
@Test
public removeNull() {
 
    List<String> list = new ArrayList<>(Arrays.asList("A", null, "B", null));
 
    List<String> newList = new ArrayList<>(Iterables.filter(list, Predicates.notNull()));
 
    assertThat(list, hasSize(4));
    assertThat(newList, hasSize(2));
}
代码语言:javascript复制
@Test
public removeNull() {
 
    List<String> list = new ArrayList<>(Arrays.asList("A", null, "B", null));
 
    List<String> newList = new ArrayList<>(Iterables.filter(list, Predicates.notNull()));
 
    assertThat(list, hasSize(4));
    assertThat(newList, hasSize(2));
}

Groovy大招

代码语言:javascript复制
   List<String> list = new ArrayList<>(Arrays.asList("A", null, "B", null));

        def re = list.findAll {
            it != null
        }

        assert re == ["A", "B"]

有兴趣可以读读Groovy中的闭包


  • 郑重声明:“FunTester”首发,欢迎关注交流,禁止第三方转载。

技术类文章精选

  • Linux性能监控软件netdata中文汉化版
  • 图解HTTP脑图
  • 性能测试中图形化输出测试数据
  • JMeter吞吐量误差分析
  • 多项目登录互踢测试用例
  • JMeter如何模拟不同的网络速度
  • 手机号验证码登录性能测试
  • 绑定手机号性能测试

无代码文章精选

  • 写给所有人的编程思维
  • 2020年Tester自我提升
  • 自动化新手要避免的坑(上)
  • 自动化新手要避免的坑(下)
  • 如何成为全栈自动化工程师
  • 简化测试用例
  • 生产环境中进行自动化测试
  • 所谓UI测试

0 人点赞