Zur Haupt­na­vi­ga­ti­on sprin­gen [Alt]+[0] Zum Sei­ten­in­halt sprin­gen [Alt]+[1]

Lamb­da-Aus­drü­cke

 

In Java ist es nicht mög­lich, Funk­tio­nen als Pa­ra­me­ter zu über­ge­ben. Ist dies nötig, wer­den Schnitt­stel­len (In­ter­faces) de­fi­niert, die die not­wen­di­ge Me­tho­de ab­stract de­fi­nie­ren. Woll­te man eine Me­tho­de über­ge­ben, muss­te man vor Java 8 eine Klas­se de­fi­nie­ren, die die­ses In­ter­face im­ple­men­tier­te und dann ein Ob­jekt die­ser Klas­se über­ge­ben. Durch die De­fi­ni­ti­on des In­ter­faces war si­cher­ge­stellt, dass das Ob­jekt die not­wen­di­ge Me­tho­de ent­hielt.

Bei­spiel: Sor­tie­ren von Ar­rays

class Vergleich implements Comparator {
   int compare(Integer zahl1, Integer zahl2) {
   if(zahl1 > zahl2) return 1; else return 0;
} 
…
Arrays.sort(zahlenliste, new Vergleich());

Seit Java 8 gibt es ein neues Sprach­ele­ment – den Lamb­da-Aus­druck, der es er­laubt, dies kom­pak­ter zu schrei­ben. Immer wenn eine Schnitt­stel­le nur eine ein­zi­ge Me­tho­de ent­hält – man nennt sie dann funk­tio­na­le Schnitt­stel­le –, dann kann ein Lamb­da-Aus­druck ein­ge­setzt wer­den.

Bei­spiel: Array-Sor­tie­rung

Arrays.sort(zahlenliste, 
         (Integer zahl1, Integer zahl2) -> 
         {if(zahl1  >  zahl2) return 1; else return 0;}
);

Bei­spie: Ac­tion-Lis­tener

sLaenge.valueProperty().addListener(
         (observable, oldValue, newValue) -> stricheln(alt)
);

Die Me­tho­de addLis­tener er­war­tet ei­gent­lich ein Ob­jekt einer Klas­se, die die Schnitt­stel­le Chan­ge­Lis­tener im­ple­men­tiert. In die­ser Schnitt­stel­le ist eine Me­tho­de changed(ObservableValue observable, T oldValue, T newValue) de­fi­niert. Die Pa­ra­me­ter die­ser Me­tho­de müs­sen in einem Lamb­da-Aus­druck in der ers­ten Klam­mer ste­hen, dann folgt das Zei­chen -> und dann die Be­feh­le, die die abs­trak­te Me­tho­de chan­ged im­ple­men­tie­ren. In die­sem Be­fehl wird also eine Klas­se de­fi­niert, die Chan­ge­Lis­tener im­ple­men­tiert, wobei der Code au­to­ma­tisch der (ein­zi­gen) Me­tho­de zu­ge­ord­net wird, die die­ses In­ter­face ent­hält. Davon wird ein Ob­jekt er­zeugt und der Me­tho­de addLis­tener über­ge­ben.

Das klingt alles sehr kom­pli­ziert, lässt sich aber sehr in­tui­tiv nut­zen. Die SuS sol­len an die­ser Stel­le nicht die Hin­ter­grün­de von Lamb­da-Aus­drü­cken ver­ste­hen. Die­ses würde fun­dier­te Kennt­nis­se der ob­jekt­ori­en­tier­ten Pro­gram­mie­rung vor­aus­set­zen. Sie nut­zen die­ses Sprach­mit­tel, indem sie den vor­ge­ge­be­nen Quell­text an­pas­sen, um ei­ge­ne Lamb­da-Aus­drü­cke zu er­stel­len.

 

Hin­ter­grund GUI-Pro­gram­mie­rung: Her­un­ter­la­den [odt][289 KB]

Hin­ter­grund GUI-Pro­gram­mie­rung: Her­un­ter­la­den [pdf][517 KB]

 

Wei­ter zu Ko­pier­vor­la­gen