你如何在 groovysh 中声明和使用 Set 数据结构?

How do you declare and use a Set data structure in groovysh?

我试过:

groovy:000> Set<String> s = ["a", "b", "c", "c"]
===> [a, b, c]
groovy:000> s
Unknown property: s

我希望能够将它用作一个集合,但即使我明确传递它,它也会将它变成一个 ArrayList:

groovy:000> joinList(["a", "b", "c", "c"])
ERROR groovy.lang.MissingMethodException:
No signature of method: groovysh_evaluate.joinList() is applicable for argument types: (java.util.ArrayList) values: [[a, b, c, c]]
Possible solutions: joinList(java.util.Set)

出现此问题的唯一原因是您使用 Groovy Shell 来测试您的代码。我不经常使用 Groovy shell,但它似乎忽略了类型,例如

Set<String> s = ["a", "b", "c", "c"]

相当于

def s = ["a", "b", "c", "c"]

而后者当然会创建一个 List。如果您 运行 在 Groovy 控制台中使用相同的代码,您会看到它实际上创建了一个 Set

Set<String> s = ["a", "b", "c", "c"]
assert s instanceof Set

在 Groovy 中创建 Set 的其他方法包括

["a", "b", "c", "c"].toSet()

["a", "b", "c", "c"] as Set

Groovy >= 2.4.0
通过

在groovyshell中将interpreterMode设置为true
:set interpreterMode true

应该可以解决这个问题

Groovy < 2.4.0
向变量添加类型使其成为 shell 环境中不可用的局部变量。

groovysh

中使用如下
groovy:000> s = ['a', 'b', 'c', 'c'] as Set<String>
===> [a, b, c]
groovy:000> s
===> [a, b, c]
groovy:000> s.class
===> class java.util.LinkedHashSet
groovy:000>