Can be very simple and elegant, like a better Python, on the JVM.
But also very rigorous, as a Java superset, with powerful features like mixing dynamic and static compilation in the same class.
Or even deep, with run-time metaprogramming and compile-time AST manipulation capabilities (giving tools like Gradle, Spock...).
And you have of course multiline interpolated Strings. And so much.
My absolute favorite thing is being able to do something like:
someIntegerCollection = someStringCollection*.toInteger()
I also find the use of closures for things like collection filtering to be quite nice: canadianUsers = someUserCollection.findAll { user ->
user.countryCode = "CA"
}
The equivalent in Python is a little more cumbersome and overly verbose: canadianUsers = [user for user in someUserCollection if user.countrycode = "CA"]
I'll still be writing things in Python whenever I can, but when I do write in Groovy there's a lot of nice stuff I get to have.