A one-line tree in Groovy
The other day, I saw Harold Cooper's One-line tree in Python via autovivication, and wondered if the same thing was possible in Groovy.
The answer is yes! But you need to define the variable tree
before you can assign it to the self-referential withDefault
closure, hence with Groovy, it's a two-line solution ;-)
Anyway, given:
def tree = { [:].withDefault{ owner.call() } }
We can then do:
users = tree()
users.harold.username = 'hrldcpr'
users.yates.username = 'tim'
And printing this out
println new groovy.json.JsonBuilder( users ).toPrettyString()
gives:
{
"harold": {
"username": "hrldcpr"
},
"yates": {
"username": "tim"
}
}