15.09.2014 Aufrufe

Schrödinger programmiert Java - Das etwas andere Fachbuch

Schrödinger programmiert Java - Das etwas andere Fachbuch

Schrödinger programmiert Java - Das etwas andere Fachbuch

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Und noch ein Trick, der mit <strong>Java</strong> 8 funktioniert: Referenzen auf Methoden<br />

Achtung: Jetzt gleich kommt wieder eine neue Syntax. Statt eines Lambda-<br />

Ausdrucks kannst du nämlich auch eine Methodenreferenz übergeben,<br />

vorausgesetzt die referenzierte Methode passt, was die Parameter und so weiter<br />

angeht. Eine Methodenreferenz definierst erst du mit Klassennamen, Doppelpunkt,<br />

Doppelpunkt und dem Methodennamen ohne Klammern:<br />

List zahlen = Arrays.asList(2,3,6,4,5);<br />

Integer groessteZahl = zahlen.stream().reduce(Integer::max*1).get();<br />

[Begriffsdefinition]<br />

Methodenreferenze en identifizieren eine<br />

Methode, ohne sie dabei aufzurufen.<br />

Auf diese Weise ist es endlich möglich,<br />

Methoden als Parameter <strong>andere</strong>r<br />

Methoden zu verwenden. Ein Feature,<br />

das es bisher in <strong>Java</strong> nicht gab und<br />

das eher umständlich über das sogenannnn-<br />

te Command-Entwu urfsmusterr<br />

gelöst<br />

werden musste.<br />

*1 So sieht eine Methodenreferenz aus.<br />

Wichtig: Die Signatur der Methode muss zu dem passen, was<br />

(in diesem Fall von reduce()) erwartet wird. Integer.max()<br />

zum Beispiel nimmt zwei Parameter vom Typ Integer entgegen<br />

(also genau das, was auch in der Liste enthalten ist) und liefert<br />

einen Wert vom gleichen Typ (Integer) zurück. Hätte die Methode<br />

nicht genau zwei Parameter vom Typ der Listenelemente oder<br />

würde sie nicht einen Rückgabewert vom gleichen Typ liefern,<br />

könnte die Methode hier nicht als Methodenreferenz verwendet werden.<br />

Der Compiler würde in so einem Fall aber<br />

einen Fehler melden.<br />

Und s ist jzt t der Unterschied zwischen<br />

Lambda-Ausdrücken und Methodenreferenzen,<br />

… ich meine, wann soll ich das eine und wann<br />

das <strong>andere</strong> verwenden?<br />

Schlaue Frage, <strong>Schrödinger</strong>. Die Antwort:<br />

anonyme Funktionen (bzw. in <strong>Java</strong> anonyme Klassen), Methodenreferenzen sind Referenzen auf<br />

existierende Methoden in existierenden nicht anonymen Klassen. Wann du was verwenden solltest,<br />

kann man nicht so pauschal sagen. Oft ist es allerdings so, dass du in einem Lambda-Ausdruck<br />

nur eine bereits existierende Methode aufrufst, so wie eben zum Beispiel bei der Berechnung<br />

der Wurzeln, als du Math.sqrt() aufgerufen hast. Dort hättest du dann auch direkt<br />

Math::sqrt<br />

verwenden können. Wenn du allerdings mehrere Methoden aufrufen musst,<br />

dann würdest du eher zu einem Lambda-Ausdruck d greifen.<br />

[Zettel]<br />

filter(), map(), reduce() und forEach()<br />

sind nicht die<br />

einzigen Methoden, die mit Lambda-Ausdrücken umgehen können.<br />

Stream<br />

bietet eine ganze Reihe weiterer Methoden. Und überhaupt, du<br />

kannst auch eigene Methoden implementieren, die Lambda-Ausdrücke<br />

akzeptieren. Aber das würde jetzt wirklich <strong>etwas</strong> weit gehen. Besser, du übst<br />

das Gelernte erstmal in der Werkstatt.<br />

352 Kapitel ACHT

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!