Schrödinger programmiert Java - Das etwas andere Fachbuch
Schrödinger programmiert Java - Das etwas andere Fachbuch
Schrödinger programmiert Java - Das etwas andere Fachbuch
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