groovygroovysh

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


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)

Solution

  • 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