Alles in xtend ist eine Expression. Dadurch ist es möglich eine Methode einer anderen Methode als Parameter zu übergeben, wie hier beschrieben:
Wir brauchen dafür die folgenden Methoden:
(1) Die calledFunction, welche als Argument übergeben wird,
(2) die callingFunction, welche die calledFunction übergibt
(3) und die genericFunction, welche die calledFunction empfängt.
Die (3) genericFunction wird immer wie folgt implementiert:
def Type genericFunction((Type)=>Type calledFunction){
Type parameter = new Type()
val result = calledFunction.apply(parameter)
}
Um (1) und (2) zu implementieren haben wir die zwei Möglichkeiten (A) und (B):
A: (1) und (2) können als Methoden implementiert werden:
(1) calledFunction:
def Type calledFunction(Type parameter){
parameter.foobar
}
(2) callingFunction:
def Type callingFunction(){
oder, noch besser lesbar (da wir nur einen Parameter haben):
genericFunction([Type parameter | parameter.calledFunction])
}
(2) callingFunction:
def Type callingFunction(){
genericFunction([calledFunction])
}
B: (1) kann als Variable implementiert werden:
(1) calledFunction:
(Type)=>Type calledFunction = [parameter | parameter.foobar]
(2) callingFunction:
def Type callingFunction(){
genericFunction(calledFunction)
}
Ich bevorzuge A, da (1) und (3) wie immer implementiert werden und in (2) die Übergabe einer Funktion als Parameter deutlich erkennbar ist.