使用 Groovy 压缩集合

作者:Paul King
发布时间:2022-11-17 12:50PM


什么是压缩?

在计算机科学中,压缩 将序列转换为序列,如果在二维空间中可视化,则行和列将被交换。因此,

[['a', 'b', 'c'],
[ 1 ,  2 ,  3 ]]

的压缩结果将是

[['a', 1],
['b', 2],
['c', 3]]

这是一个非常实用的操作,取决于语言,可能支持元组、列表、流和其他序列或聚合。

Java 集合和流目前不支持这种开箱即用的功能,各种解决方法在 这里 进行讨论。总结:语言和库设计很困难;Java 提供的任何压缩实现都将包含一些固有的限制,因此它们提供必要的原语来允许人们根据其特定需求构建自己的实现。

我们将看看 Groovy 提供了什么以及一些可用的 Java 库,你也可以使用它们。相同的注意事项适用于这些库,每个库都有自己的实现优势和劣势。

我们将使用一个示例,灵感来自 Donald Raab博客文章。它探讨了压缩(和格式化)包含“秋季”灵感表情符号的字符串列表。是的,对于南半球来说,现在是初春,他们也大多称秋季为“秋天”,但希望每个人都能欣赏这种灵感。

some fall inspired emojis


Groovy

Groovy 使用 transpose 方法进行压缩

zipping example with Groovy

Eclipse Collections

Eclipse Collections 在其列表类中有一个 zip 方法

zipping example with Eclipse Collections

Guava

Guava 有一个流实用程序类,其中有一个 zip 方法

zipping example with Guava

StreamEx

StreamEx 提供了一个增强的流库,它支持 zipWith

zipping example with StreamEx

Vavr

Vavr 在其列表类中有一个 zipWith 方法

zipping example with Vavr

jOOλ

jOOλ 为其序列提供了一个 zip 方法

zipping example with jOOλ

Groovy GQuery

如果您是查询类 DSL 的粉丝,Groovy 的语言集成查询 GQuery(又名 GINQ)也可以使用

zipping example with GQuery

这在 GQ 表达式中使用一个特殊的 _rn“行号”预定义变量。它遵循与本文中提到的 Java IntStream“解决方法”相同的策略 博客

更多信息

代码示例可以在 仓库 中找到