Mit Version 8 erreichen Lambda Expressions endlich Java und gehören in naher Zukunft zum Standard-Repertoire eines jeden Java-Entwicklers. Doch wie schlägt man am besten die Brücke von Java 7 zu Java 8? Nahezu zeitgleich mit dem Release von Java 8 ist das neue Buch Functional Programming in Java von Venkat Subramaniam erschienen. Das Buch hat den Anspruch, genau diese Lücke zu schließen und insbesondere Leser mit wenig bis keiner Erfahrung in funktionaler Programmierung effektiv mit den Möglichkeiten der neuen Lambda-Funktionen und der Streams-API vertraut zu machen.

Der Autor verfolgt einen durchweg lösungsorientierten Ansatz für typische Problemstellungen, die im Alltag eines Java-Entwicklers auftreten. So zeigt er zunächst auf, wie man von einer externen zu einer internen Iteration gelangt und welche Vorzüge sich daraus für die Lesbarkeit des Codes ergeben. Bessere Lesbarkeit durch deklaratives Programmieren ist zwar ein wiederkehrendes Thema im Buch, allerdings nicht der einzige Vorteil: Aspekte wie einfache Parallelisierbarkeit und die Tatsache, dass keine explizite Mutation von Daten erfolgt sprechen ebenfalls für eine funktionale Lösung und bleiben nicht ohne Erwähnung.

In den weiterführenden Kapiteln beschäftigt sich der Autor unter Anderem damit, bestehende Klassen im JDK mit funktionalen Bedienkonzepten zu verbinden. Das schließt bspw. die Transformation von anonymen inneren Klassen hin zu äquivalenten Lambda-Ausdrücken mit ein.

Neben Vererbung und Delegation erhalten Java-Entwickler durch Lambda-Ausdrücke eine weitere Abstraktionsmöglichkeit, um ein Design offen gegenüber Erweiterungen, aber geschlossen gegenüber Änderungen zu halten (vgl. Open-Closed Principle). Diesen Aspekt beleuchtet das Buch ebenfalls und gibt gute Tipps dazu, wie man mit Hilfe von Lambdas dem Code-as-Data-Prinzip folgen und somit das Softwaredesign flexibel halten kann.

Der Autor diskutiert ebenso fortgeschrittene Nutzungsmöglichkeiten, die dem Leser einen guten Eindruck vermitteln, wie mächtig die sinnvolle Anwendung funktionaler Konzepte ist. Venkat zeigt bspw. durch eine Realisierung des Execute-Around-Method-Patterns mit Lambdas auf, dass der sichere Umgang mit Ressourcen (Dateien, Locks) in eleganter Weise möglich ist und problembehaftete Altlösungen in Zukunft ablösen kann.

Ein wichtiges Konzept in der funktionalen Programmierung ist die verzögerte Auswertung eines Ausdrucks. Venkat zeigt, dass man sich dieses Konzept zu Nutzen machen kann, um die Instanzierung schwergewichtiger Klassen auf den Zeitpunkt hin zu verzögern, zu dem sie tatsächlich benötigt werden. Ein Anwendungsfall, der sich intuitiv nicht sofort erschließen mag, ist die Nutzung unendlicher Streams. Streams unendlicher Länge lassen sich in der Regel elegant formulieren, sind aber aufgrund sofortiger Auswertung nicht praktikabel. Die Streams-API schafft hier durch die Möglichkeit einer verzögerten Auswertung Abhilfe, da ein potentiell unendlicher Stream nur soweit realisiert wird, wie es notwendig ist. Auch hierfür bietet Venkat ein motivierendes Beispiel.

Schön ist, dass der Autor zu jedem Problem zunächst die gewohnheitsmäßige Lösung präsentiert und diese Schritt für Schritt zu einer Lösung überführt, die die neuen Sprachfeatures benutzt. So ist der direkte Vergleich mit Altbekanntem möglich und zeigt die Vorzüge einer funktionalen Lösung anschaulich auf. Die Progression über die Kapitel ist konstant gut, da die Lernkurve nicht zu steil beginnt, aber mit den fortschreitenden Kapiteln doch etwas anzieht.

Objektorientierte und Funktionale Programmierung schließen sich nicht gegenseitig aus, sondern ergänzen sich und ermöglichen die Gestaltung von Lösungen, die ausdrucksstärker und eleganter sind. Die Diskussion der Vorzüge von Funktionaler Programmierung insbesondere in der Kombination mit Objektorientierung ist ein wiederkehrendes Thema im Buch, das der Autor mit gelungenen Beispielen veranschaulicht. Es ist auch gar nicht so sehr die Kombination beider Paradigmen, sondern vielmehr die daraus resultierende Abkehr von der reinen imperativen Programmierung hin zu einem deklarativen Ansatz, die den größten Nutzen stiftet.

Das Buch ist mit 160 Seiten und der durchweg zugänglichen Sprache einfach und schnell zu lesen. Die vielen Anwendungsbeispiele zeigen den praktischen Nutzen der neuen Sprachfeatures auf und laden zum Ausprobieren ein. Interne Details zu Lambda-Ausdrücken oder der Arbeitsweise der Streams-API streift der Autor allerdings nur kurz. Aber das Buch hat auch nicht den Anspruch eines detaillierten Design-Dokuments, sondern soll Java-Entwickler möglichst effektiv und pragmatisch mit den neuen Features vertraut machen - und dieses Unterfangen gelingt dem Autor ganz vorzüglich.