When we write recursive code we might get a stack overflow exception, because calls are placed on the stack to be resolved. Since Groovy 1.8 we can use the trampoline capability of closures to overcome this problem.
We invoke a trampoline() method on a closure and our original closure is now wrapped in TrampolineClosure instance. Calls to the TrampolineClosure are executed sequentially invoking the original closure, until the original closure returns something else then a TrampolineClosure instance. This way the stack isn't filled and we won't get the stack overflow exceptions.
def sizeList
sizeList = { list, counter = 0 ->
if (list.size() == 0) {
counter
} else {
sizeList.trampoline(list.tail(), counter + 1)
}
}
sizeList = sizeList.trampoline()
assert sizeList(1..10000) == 10000
Try with Groovy web console.