减去 groovy 中的枚举元素

Subtracting Enum elements in groovy

假设我们有一个枚举:

enum MyEnum
{
   ONE, TWO
}

我们可以使用以下方法轻松地相互减去 MyEnum 值:

def a = MyEnum.values()
println (a - MyEnum.values()) //results: []

但是如果我们尝试使用强类型,我们不会收到空列表:

Collection<MyEnum> a = MyEnum.values()
println (a - MyEnum.values()) //results: [ONE, TWO]

我们应该使用什么类型来正确减去 MyEnum 值,为什么?

鉴于 E.values() 的 return 类型是 E[] 显而易见的答案 会是

MyEnum[] a = MyEnum.values()

两个数组“相减”的方式定义在 org.codehaus.groovy.runtime.DefaultGroovyMethods:

public static <T> T[] minus(T[] self, Object[] removeMe) {

但是如果您使用的是“collection-y”,则使用这个(例如这里的 Set):

public static <T> Set<T> minus(Set<T> self, Object removeMe)

(只有给定的 元素 将被删除 - 而不是每个元素)。

所以如果你想要一些“collection-y”,那么你也必须打开 数组变成可迭代的东西或“collection-y”。例如。这也适用:

Set<MyEnum> a = MyEnum.values()
println (a - MyEnum.values().toList())
// → []

如果你想要明确,你也可以使用像这样的函数 removeAll.