使用 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”,但希望每个人都会欣赏这个灵感。
Groovy
Groovy 使用 transpose
方法进行压缩
Eclipse Collections
Eclipse Collections 在其列表类上有一个 zip
方法
Guava
Guava 有一个带有 zip
方法的流实用程序类
StreamEx
StreamEx 提供了一个增强的流库,它支持 zipWith
Vavr
Vavr 在其列表类上有一个 zipWith
方法
jOOλ
jOOλ 为其序列提供了一个 zip
方法
Groovy GQuery
如果您是查询式 DSL 的粉丝,Groovy 的语言集成查询 GQuery(又名 GINQ)也可以使用
这在 GQ 表达式中使用了特殊的 _rn
“行号”预定义变量。它遵循与此博客中提到的 Java 的 IntStream“变通方法”相同的策略。
更多信息
代码示例可在仓库中找到