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
在这种情况下,我们也可以使用 findAll
和 grep
无参数快捷方式。这些快捷方式遵循 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)
-
无参数快捷方式变体从 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 变换对于自动将空值检查添加到您自己的类、方法和构造函数中很有用。有关更多详细信息,请参阅 文档。