Groovy 的集合运算符
作者: Paul King
发布时间: 2023-11-14 03:22PM
Donald Raab 发布了 一篇文章,介绍了使用 Java 集合和 Eclipse Collections 的集合运算符。 那篇文章 侧重于并集、交集和差集运算符。 我们将添加对称差,因为 Groovy 也支持对该运算符的运算符重载。
首先,快速回顾一下两个集合A和B的运算符
我们将使用 Donald 文章中相同的 emoji 集合
Set OCT = ["🍁", "🍃", "🎃", "🥧", "🍫", "🌝", "👻", "🌽", "🍎", "🪵", "☕️"]
Set NOV = ["🍂", "🍁", "🥧", "🦃", "🌽", "🍎", "🪵", "☕️"]
Set DEC = ["🥧", "🦃", "⛄️", "🍎", "🌰", "🛷", "🪵", "🎄", "☕️"]
Groovy 允许你编写与 Donald 文章中相同的代码,但也为这些运算符提供运算符重载,如下所示
assert (OCT & NOV & DEC) == ["🪵", "🥧", "🍎", "☕️"] as Set
assert (OCT | NOV | DEC) == ["🪵", "🦃", "🌰", "🛷", "🍎", "🎄",
"🍫", "🌝", "☕️", "🥧", "⛄️", "🍁",
"🍂", "🍃", "👻", "🌽", "🎃"] as Set
assert (OCT - NOV - DEC) == ["🍫", "🌝", "🍃", "👻", "🎃"] as Set
assert (NOV - OCT - DEC) == ["🍂"] as Set
assert (DEC - OCT - NOV) == ["🎄", "🌰", "⛄️", "🛷"] as Set
assert (OCT ^ NOV ^ DEC) == ['⛄️', '🌰', '🛷', '🎄', '🍃', '🎃', '🍫', '🌝',
'👻', '🍂', '🥧', '🍎', '🪵', '☕️'] as Set
assert (NOV ^ OCT ^ DEC) == ['🍂', '🍃', '🎃', '🍫', '🌝', '👻', '🥧', '⛄️',
'🍎', '🌰', '🛷', '🪵', '🎄', '☕️'] as Set
此代码使用标准的可变 Java 集合,但如果需要,我们可以使用正常的Set.of(…)
形式并使用不可变集合。
此外,由于 Eclipse Collections Set 实现实现了标准的 Java Set
接口,因此这些运算符重载简写也适用于使用 Eclipse Collections 时。我们只需在集合定义中使用Sets.immutable.of(…)
。
更重要的是,由于 Groovy 的运算符重载是可扩展的,你也可以为自己的域对象拥有类似的简写符号。享受吧!
此示例使用的是 Groovy 5 的 Alpha 版本。Groovy 5 在使用集合时增加了一些额外的语法糖。早期版本的 Groovy 针对集合提供了union
和intersect
方法。