使用 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 的 博客文章。它探讨了压缩(和格式化)包含“秋季”灵感表情符号的字符串列表。是的,对于南半球来说,现在是初春,他们也大多称秋季为“秋天”,但希望每个人都能欣赏这种灵感。
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“解决方法”相同的策略 博客。
更多信息
代码示例可以在 仓库 中找到