Groovy™ 处理列表中的空值

作者: Paul King

发布日期:2023-02-06 12:00AM


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

涵盖的库

Shubhra 的文章审视了“开箱即用”的 Java 和一些其他集合库。我们将看看如何将这些相同的库与 Groovy 一起使用,但我们也会涵盖 Eclipse Collections。

总而言之,我们将涵盖

  • “开箱即用”的 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 truth,它将删除空值,但也会删除空字符串和零。这可能正是我们想要的,也可能不是。

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 truth

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 处理空值,祝您玩得开心!