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
|