Groovy 处理列表中的空值

作者:Paul King
发布日期:2023-02-06 12:00AM


这篇文章 文章Shubhra Srivastava 撰写,介绍了在 Java 中处理包含空值的列表。我们来看看如何在 Groovy 中做同样的事情。Shubhra 的文章涵盖了就地修改列表和生成新列表,所以我们也将涵盖这两种情况。

涵盖的库

Shubhra 的文章考察了“开箱即用” Java 和一些其他集合库。我们将看看在 Groovy 中使用这些相同的库,但我们也将涵盖 Eclipse 集合。

总之,我们将涵盖

  • “开箱即用” Groovy(包括 JDK 功能)

  • Guava,它为 JDK 集合生态系统提供了许多扩展。特别是,它具有不可变集合、新的集合类型(如多集和双向映射)以及各种强大的扩展和实用程序。

  • Apache Commons Collections,它扩展了 JDK 集合框架,添加了一些新的类型(如双向映射和包),并提供了许多比较器和迭代器实现。该库旨在弥补 JDK 的不足,虽然 JDK 本身已经填补了其中的一些不足,但 Commons Collections 仍然包含许多有用的功能。

  • Eclipse Collections,它带有很多容器类型,包括不可变集合、基本类型集合、双向映射、多映射和包,以及大量实用程序方法。它侧重于减少内存占用和高效容器。如果您需要基本类型集合、不可变集合或一些更奇特的集合类型(如包或双向映射),它可能特别有用。

修改列表以删除其空值

Groovy

使用 Groovy,我们可以遵循 Java 的做法,使用 removeIf 或使用 Groovy 的 removeAll。在这两种情况下,我们可以使用方法引用、闭包语法或 lambda 语法来捕获所需的非空约束。

var list = ['A', null, 'B', null, 'C']
list.removeIf(Objects::isNull)
assert list.size() == 3
var list = ['A', null, 'B', null, 'C']
list.removeAll(s -> s == null)
assert list.size() == 3

Guava

var list = ['A', null, 'B', null, 'C']
Iterables.removeIf(list, Predicates.isNull())
assert list.size() == 3

Apache Commons Collections

var list = ['A', null, 'B', null, 'C']
CollectionUtils.filter(list, PredicateUtils.notNullPredicate())
assert list.size() == 3

Eclipse Collections

var list = Lists.mutable.of('A', null, 'B', null, 'C')
list.withoutAll([null])
assert list.size() == 3

生成一个没有空值的新的列表

Groovy

我们可以根据原始文章使用 Java 流,也可以避免使用流并使用 Groovy 的 findAll 方法

assert ['A', null, 'B'].stream().filter(Objects::nonNull).toList().size() == 2
assert ['A', null, 'B'].findAll(Objects::nonNull).size() == 2

在这种情况下,我们也可以使用 findAllgrep 无参数快捷方式。这些快捷方式遵循 Groovy 真值,它将删除空值,还会删除空字符串和零。这可能是我们想要的,也可能不是我们想要的。

assert ['A', null, 'B'].findAll().size() == 2
assert ['A', null, 'B'].grep().size() == 2

assert ['A', null, 'B', '', 0].findAll().size() == 2
assert ['A', null, 'B', '', 0].grep().size() == 2

Groovy 还具有 findResults 方法,它专门查找非空结果,而不是应用 Groovy 真值

assert ['A', null, 'B'].findResults{ it }.size() == 2
assert ['A', null, 'B'].findResults().size() == 2             // (1)
assert ['A', null, 'B', '', 0].findResults().size() == 4      // (1)
  1. 无参数快捷方式变体从 Groovy 4.0.9 开始可用。

Guava

assert Iterables.filter(['A', null, 'B'], Predicates.notNull()).size() == 2

Apache Commons Collections

assert CollectionUtils.select(['A', null, 'B'], PredicateUtils.notNullPredicate()).size() == 2

Eclipse Collections

assert Lists.mutable.of('A', null, 'B').select(Predicates.notNull()).size() == 2

在结束之前,我们应该提到一些与空值相关的其他 Groovy 功能。虽然与列表处理无关,但 Groovy 的 @NullCheck AST 变换对于自动将空值检查添加到您自己的类、方法和构造函数中很有用。有关更多详细信息,请参阅 文档

更多信息

使用 Groovy 处理空值,玩得开心!