
Quelle: successfulsoftware.net
Was zum Teufel?
Es ist in der Tat zwingend notwendig zu erwähnen, dass Lambda-Kalkül und Kombinatorik die Grundlagen der Computermathematik bilden.
Und zweifellos gibt es eine Fülle von Sprachen, die für die funktionale Programmierung geeignet sind: Lisp, Caml, Clojure, Haskell (rein funktional), und die Liste geht noch weiter. Und für Java-Liebhaber gibt es natürlich Scala - hier trifft objektorientiert auf funktional.
Andererseits ist Java, seit das JDK seinen Weg in die Maschinen gefunden hat, für serverseitige Algorithmen fast unentbehrlich geworden; warum also sollte ein Java-Liebhaber sich mit Scala oder ähnlichem befassen ?!
Willkommen - JDK 8 !
Was gibt's Neues?
Die Einführung von Streams, funktionalen Schnittstellen, Lambdas und der JavaScript-Engine Nashorn und anderen hat JDK 8 zu einer der größten Veröffentlichungen gemacht.
Wo steht Java also im Vergleich zu den oben genannten Sprachen in der funktionalen Programmierung wirklich gut da?
Als Mitglied des Oracle Developers Network (ehemals Sun Developers Network) kann ich mich gut daran erinnern, dass der Begriff der funktionalen Programmierung nicht erst vor sechs Jahren auf den ODN-Treffen aufkam. Vielmehr hat die Java-Entwicklergemeinschaft schon vor dem Auftauchen von Haskell über die Einbeziehung der funktionalen Programmierung in Java nachgedacht. Es gab natürlich hitzige Debatten über objektorientierte und funktionale Ansätze und darüber, wie man letztere einbinden könnte, da OOP in Java angeboren ist.
Das Aufkommen von Scala im Jahr 2004 hat SUN dazu veranlasst, sich weiter der funktionalen Programmierung zuzuwenden und die dringend benötigten FP-Funktionen in Java einzuführen.
Lambda
Lambda bietet Closures, die mehr Kontrolle über die Parallelität bei der Mehrkernprogrammierung ermöglichen.
Das JDK enthält bereits das fork/join-Framework, das paralleles Rechnen ermöglicht. Bei fork/join müssen Sie jedoch angeben, wie die Probleme partitioniert werden sollen.
Bei Lambdas übernimmt die Java-Laufzeitumgebung diese Partitionierung und Kombination von Lösungen.
Lambdas sind Funktionen erster Klasse, die können:
- als Argumente an andere Funktionen übergeben werden
- von anderen Funktionen zurückgegeben werden
- Funktionen zu Variablen zuweisen
- Funktionen in Datenstrukturen speichern
- Funktionen anonym sein lassen
Lambda/FP-Delikatessen, Verwendung und bewährte Praktiken
Verarbeiten Sie den folgenden Ausschnitt:
Und dann lassen Sie uns die oben genannten FP:
Oh, warten Sie! Haben wir gerade beobachtet, dass Type Defs verschwunden ist?
Lambdas enthalten neben Funktionen erster Klasse auch die Typinferenz - die Klarheit des Codes wird verbessert, und die offensichtliche Ausführlichkeit der anonymen inneren Klasse wird auf eine Funktion erster Ordnung reduziert.
Reduzierte forEach seit Java 8:
Das obige Snippet kann ersetzt werden durch:
die durch eine FP "eta expansion" -Methodenreferenz weiter reduziert werden kann:
Die Magie von FP in Java endet hier natürlich noch nicht.
Abbildung der funktionalen Schnittstelle:
Ja, die Kürzungen sind der Kern der funktionalen Programmierung, und Java 8 Lambdas unterstützen sie.
Wo immer wir auf einen Zieltyp stoßen, können Lambda-Ausdrücke verwendet werden. In Java gibt es den Zieltyp in den folgenden Kontexten:
- Variablendeklarationen, Zuweisungen
- Funktion gibt zurück
- Argumente für Methoden oder Konstruktoren
Die Streams-API und Lambdas können zusammen dazu beitragen, dass bei der Ausführung von Massenoperationen über Sammlungen ein erhebliches Maß an Parallelität erreicht wird.
Eine Stream-Filterung mit Lambda-Prädikat:
Ohne orthodox zu sein, lassen Sie uns doch ein paar Schlaglichter auf die Verwendung werfen:
Verwenden Sie die Annotation @FunctionalInterface für jede Schnittstelle, die als Funktion verwendet werden soll.
Bei einem großen Projekt verhindert dies, dass eine funktionale Schnittstelle, die nur eine abstrakte Methode enthalten sollte, versehentlich durch weitere abstrakte Methoden ergänzt wird. Die Annotation lässt den Compiler jeden aufschreien, der versucht, mehr als die einzig vorgesehene (abstrakte) Funktion hinzuzufügen . Außerdem sollten Sie die Verwendung von Standardmethoden in funktionalen Schnittstellen auf ein Minimum beschränken.
Bevorzugen Sie die Verwendung der Standard-Funktionsschnittstellen, die in der java.util.function und anderen Paketen.
Natürlich sollten Sie Duplikate vermeiden und auf Wiederverwendbarkeit setzen. Solange wir Standardfunktionen wiederverwenden können, ist es besser, keine eigenen zu erstellen.
Halten Sie Lambda-Ausdrücke elegant.
In Situationen wie der folgenden:
Halten Sie den Lambda-Ausdruck kurz, und extrahieren Sie die überflüssigen Codezeilen in eine separate Methode:
Vermeiden Sie Lambdas, bei denen Methodenreferenzen (eta-Erweiterungen) möglich sind.
Anstelle von:
Verwenden Sie:
Idealerweise sollten Sie Lambdas mit Bedacht einsetzen. Wenn Sie Lambdas, die mehrere Codezeilen umfassen, und ausführliche funktionale Schnittstellen übermäßig verwenden, haben Sie Probleme beim Testen, Debuggen und Warten.
Also, was ist schon dabei?
Abgesehen von der Tatsache, dass wir jetzt die Schönheit der funktionalen Programmierung nutzen können, ohne die objektorientierten Aspekte zu vernachlässigen, ist es auch offensichtlich, dass sich dies auf den Codierungsstil der Programmierer auswirken würde - knackige, präzise und klare Codierung.
Natürlich gibt es subtile Täler in den Gipfeln der Lambdas - Einschränkungen in Java 8 Lambdas. Die Lambda-Funktionen schließen nur über Werte, aber nicht über Variablen.
Tun Sie dies:
Und am Ende kreischt der Compiler auf: Die lokale Variable x, die in einem umschließenden Bereich definiert ist, muss final oder effektiv final sein.
Vollständige Closures werden in Java also noch nicht unterstützt.
Und doch hat die Einführung von Lambdas in Java enorme Auswirkungen gehabt - Java hat endlich die Begeisterung für FP eingeholt. Bleiben Sie am JDK dran, denn die weitere Entwicklung wird hoffentlich weitere Funktionen für die funktionale Programmierung erster Ordnung in Java bringen.

Verfasst von
Subhajoy Laskar
Computer scientist, music enthusiast and avid traveller.
Unsere Ideen
Weitere Blogs
Contact



