使用 Groovy™ 压缩集合

作者: Paul King

发布时间:2022-11-17 12:50 PM


什么是压缩?

在计算机科学中,压缩将序列转换为序列,如果以二维可视化,则行和列会互换。因此,以下内容的压缩为

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

将是

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

这是一个非常方便的操作,根据语言的不同,它可能支持元组、列表、流和其他序列或聚合。

Java 集合和流目前不支持开箱即用的此类功能,各种变通方法已在此讨论。总结:语言和库设计很困难;Java 提供的任何压缩实现都会有一些固有的限制,因此它们反而提供了必要的原语,以允许人们根据其特定要求构建自己的实现。

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

我们将使用受 Donald Raab 的这篇博客文章启发的示例。它着眼于压缩(和格式化)包含“秋季”主题表情符号的字符串列表。是的,现在是南半球的晚春,他们大多也称秋天为“autumn”,但希望每个人都会欣赏这个灵感。

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“变通方法”相同的策略。

更多信息

代码示例可在仓库中找到