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

57.8k Views Asked by At

I've tried:

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

I want to be able to use this as a set, but even if I pass it explicitly, it turns it into an 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)
2

There are 2 best solutions below

6
On BEST ANSWER

This problem only occurs because you're using the Groovy Shell to test your code. I don't use the Groovy shell much, but it seems to ignore types, such that

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

is equivalent to

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

and the latter does of course create a List. If you run the same code in the Groovy console instead, you'll see that it does actually create a Set

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

Other ways to create a Set in Groovy include

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

or

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

Groovy >= 2.4.0
Setting interpreterMode to true in groovy shell by

:set interpreterMode true

should fix this issue

Groovy < 2.4.0
Adding a type to the variable makes it a local variable which is not available to shell's environment.

use as below in 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>