Control Structures

Groovy Truth

The Groovy truth in some cases is different from Java, so you need to make sure that Groovy gives you what you expect.

Truth examples
// Boolean
assert true
assert !false

// Matcher
assert ('a' =~ /a/)
assert !('a' =~ /b/)

// Collection
assert [1]
assert ![]          // empty List = false

// Map
assert [1:'one']
assert ![:]         // empty Map = false

// String
assert 'a'
assert !''          // empty String = false

// Number
assert 1
assert 3.5
assert !0           // 0 = false

// None of the above 
assert new Object()
assert !null        // null = false

Conditional Structures

I have already covered a number of these back in my basics section.

Conditional examples
if( true ) {
    println "true"
}

if( true ) 
    println true
    
def age = 35
if( age >= 35 ){
    println "can run for president"
}

if( false ) {
    println "true"
} else { 
    println "false"
}

def yourage = 18
if( yourage >= 21 ) {
    println "buy beer"
} else {
    println "no beer for you"
}

def someage = 37

if( someage >= 21 && someage < 35 ) {
    println "buy some beer"
} else if( someage >= 35 ) {
    println "run for president"
} else {
    println "under 21..."
}  

// -------------------------------------------------------
// ternary operator (expression) ? true : false

def name = 'Paul'
def isit = (name.toLowerCase() == 'PAUL') ? 'YES' : 'NO'
println isit

def msg 
def output = (msg != null) ? msg : 'default message...'

def elvisOutput = msg ?: 'default message...' // shortcut for above

println msg
println output
println elvisOutput

// -------------------------------------------------------

def num = 12

switch( num ) {
    case 1:
        println "1"
        break
    case 2:
        println "2"
        break
    case 1..3:
        println "in range 1..3"    
        break
    case [1,2,12]:
        println "num is in list [1,2,12]"
        break
    case Integer:
        println "num is an Integer"
        break
    case Float:
        println "num is a float"
        break
    default:
        println "default..."    
}

// in 
def validAges = 18..35
def someAge = 19
println someAge in validAges

Looping

I have already covered a number of these back in my basics section plus I have covered Closures as well.

Looping examples
// while
List numbers = [1,2,3]
while( numbers ) {
    // do something
    numbers.remove(0)
}

assert numbers == []                            // test above remove

// for loops

List nums = [1,2,3]
for( Integer i in 1..10 ) {                     // you can specify the data type
    println i
}

for( i in 1..5 ) {                              // you don't have to specify the data type, remember its dynamic 
    // do stuff
}

// return/break/continue
String getFoo() {
    "foo"                                       // last line of any method is automatically returned, no need for return
}

Integer a = 1
while( true ) { // infinite loop
    a++
    break
}
assert a == 2

for( String s in 'a'..'z' ){                    // use a range
    if( s == 'a') continue                      // one-line if statement
    println s
    if( s > 'b' ) break
}

Exception Handling

Exception handling is very similar to Java, you use the try-catch block to try a piece of code and if it fails then the appropriate catch clause will be invoked, as with Java you can also throw your own exceptions.

Exception examples
def foo() {                 // you don't need 'throws Exception' as part of the signature in Groovy
    // do stuff
    throw new Exception("Foo Exception")
}

List log = []
try {
  foo()  
} catch( Exception e ) {
    log << e.message         // same as e.getMessage()
} finally {
    log << 'finally'         // will always run regardless
}
println log

// Java 7 introduced a multi catch syntax
try {
    // do stuff
} catch( FileNotFoundException | NullPointerException e ) {                 // notice only one |
    println e.class.name
    println e.message
}