Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Martin Fowler wrote an article in his Bliki on Closures. He uses Ruby as demonstration language for closures. On this page (nearly) the same example is written in Groovy:

Code Block
def managers(emps) {
	emps.findAll { e -> e.isManager() }
}
Code Block
def highPaid(emps) {
	threshold = 150
	emps.findAll { e -> e.salary > threshold }
}
Code Block
def paidMore(amount) {
	{ e -> e.salary > amount}
}
Code Block
def highPaid = paidMore(150)
println highPaid(emps[0])
Code Block
new File(filename).withReader{ reader -> doSomethingWith(reader) }

The whole example with class Employee (with an dispensible, but convenient, because boosting readability, toString() method), an example list with four employees and some explaining assertions (Dierk would call this Inline Unittests):

Code Block
class Employee {
	def name, salary
	boolean manager
	String toString() { return name }
}

def emps = [new Employee(name:'Guillaume', manager:true, salary:200),
	new Employee(name:'Graeme', manager:true, salary:200),
	new Employee(name:'Dierk', manager:false, salary:151),
	new Employee(name:'Bernd', manager:false, salary:50)]

def managers(emps) {
	emps.findAll { e -> e.isManager() }
}

assert emps[0..1] == managers(emps) // [Guillaume, Graeme]

def highPaid(emps) {
	threshold = 150
	emps.findAll { e -> e.salary > threshold }
}

assert emps[0..2] == highPaid(emps) // [Guillaume, Graeme, Dierk]

def paidMore(amount) {
	{ e -> e.salary > amount}
}
def highPaid = paidMore(150)

assert highPaid(emps[0]) // true
assert emps[0..2] == emps.findAll(highPaid)

def filename = 'test.txt'
new File(filename).withReader{ reader -> doSomethingWith(reader) }

def readersText
def doSomethingWith(reader) { readersText = reader.text }

assert new File(filename).text == readersText