Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Groovy uses a similar syntax to Java although in Groovy semicolons are optional.
This saves a little typing but also makes code look much cleaner (surprisingly so for such a minor change). So normally if one statement is on each line you can ommit semicolons altogether - though its no problem to use them if you want to. If you want to put multiple statements on a line use a semicolon to separate the statements.

If the end of the line is reached and the current statement is not yet complete it can be spanned across multiple lines. So for things like method parameters or creating lists or for complex if expressions you can span multiple lines.

h2 Method calls

Method calling syntax is similar to Java where methods can be called on an object (using dot) or a method on the current class can be called. Static and instance methods are supported.

Error rendering macro 'code': Invalid value specified for parameter 'lang'
class Foo {
	calculatePrice() {
		1.23
	}
	
	static void main(args) {
		foo = new Foo()
		p = foo.calculatePrice()
		assert p > 0
		
		println "Found price: " + p
	}
}

Notice that the return statement is optional at the end of methods. Also you don't need to specify a return type (it will default to Object in the bytecode if none is specified).

h2 Optional parenthesis

Method calls in Groovy can ommit the parenthesis if there is at least one parameter and there is no ambiguity.

Error rendering macro 'code': Invalid value specified for parameter 'lang'
println "Hello world"
System.out.println "Nice cheese Gromit!"

h2 Named parameter passing

When calling a method you can pass in named parameters. Parameter names and values are separated by a colon (like the Map syntax) though the parameter names are identifiers rather than Strings.

Currently this kind of method passing is only implemented for calling methods which take a Map or for constructing JavaBeans.

Error rendering macro 'code': Invalid value specified for parameter 'lang'
bean = new Expando(name:"James", location:"London", id:123)
println "Hey " + bean.name
assert bean.id == 123

Please refer to

Error rendering macro 'link' : Link needs a name and a URL as arguments.
for more examples

h2 Passing closures into methods

Closures are described in more detail

Error rendering macro 'link' : Link needs a name and a URL as arguments.
. Closures can be passed into methods like any other object

Error rendering macro 'code': Invalid value specified for parameter 'lang'
closure = { param | param + 1 }
answer = [1, 2].collect(closure)
assert answer == [2, 3]

Though there is some syntax sugar to make calling methods which take a closure easier. Instead of specifying parenthesis, you can just specify a closure. e.g.

Error rendering macro 'code': Invalid value specified for parameter 'lang'
answer = [1, 2].collect { param | param + 1 }
assert answer == [2, 3]

The above code is equivalent to the previous code, just a little more groovy. If a method takes parameters you can leave the closure outside of the parenthesis (provided that the closure parameter is the last parameter on the underlying method).

Error rendering macro 'code': Invalid value specified for parameter 'lang'
value = [1, 2, 3].inject(0) { count, item | count + item }
assert value == 6

The above code is equivalent to the following (but just neater)

Error rendering macro 'code': Invalid value specified for parameter 'lang'
value = [1, 2, 3].inject(0, { count, item | count + item })
assert value == 6

h2 Important Note

Note that when using the neater syntax for specifying closures either without parenthesis or by specifying the closure after the parenthesis, the closure must start on the same line. i.e. the { symbol must be on the same line as the method call statement. Otherwise the parser
interprets the { as a start of a block.

h2 Dynamic method dispatch

If a variable is not constrained by a type then dynamic method dispatch is used. This is often referred to as dynamic typing whereas Java uses static typing by default.

You can mix and match both dynamic and static typing in your code by just adding or removing types. e.g.

Error rendering macro 'code': Invalid value specified for parameter 'lang'
dynamicObject = "hello world".replaceAll("world", "Gromit")
dynamicObject += "!"
assert dynamicObject == "hello Gromit!"

String staticObject = "hello there"
staticObject += "!"
assert staticObject == "hello there!"

h2 Properties

These are described in more detail in the

Error rendering macro 'link' : Link needs a name and a URL as arguments.
section.

To access properties you use dot with the property name. e.g.

Error rendering macro 'code': Invalid value specified for parameter 'lang'
bean = new Expando(name:"James", location:"London", id:123)
name = bean.name
println("Hey ${name}")
bean.location = "Vegas"
println bean.name + " is now in " + bean.location
assert bean.location == "Vegas"

The above uses a special bean called Expando which allows properties to be added dyanmically at runtime.

h2 Safe navigation

If you are walking a complex object graph and don't want to have NullPointerExceptions thrown you can use the -> operator rather than . to perform your navigation.

Error rendering macro 'code': Invalid value specified for parameter 'lang'
foo = null
bar = foo->something->myMethod()
assert bar == null
  • No labels