12.8 Zum Weiterlesen
Funktional zu programmieren, ändert grundlegend das Design von Java-Programmen – weg von Methoden mit Seiteneffekten hin zu kleinen Funktionen, die Objekte mit neuen Zuständen liefern. Die Zukunft wird uns Muster und Best Practices an die Hand geben, wie in Java entwickelt wird. Auch wird sich zeigen, ob weitere Konzepte der funktionalen Programmierung in Java bzw. die JVM einfließen werden. Bisher ist zum Beispiel Immutability kein Sprachkonstrukt, sondern durch die API gewährleistet, wenn es keine Setter oder Schreibzugriffe auf Variablen gibt; Reflection kann uns aber auch hier einen bösen Strich durch die Rechnung machen. Ansätze für kommende Java-Version im Bereich Pattern Matching stellt Brian Goetz im Video http://www.youtube.com/watch?v=n3_8YcYKScw vor; unter http://openjdk.java.net/jeps/305 gibt es die Projektbeschreibung. Die Optimierung von Endrekursion (engl. tail call optimization) aufseiten der JVM – etwas, was in anderen funktionalen Programmiersprachen immer hochgehalten wird – ist aktuell nicht in der HotSpot JVM implementiert.
Java liefert im Paket java.util.function für die üblichen Szenarien funktionale Schnittstellen aus. Das reicht unter Umständen nicht. Es gibt zum Beispiel keine funktionale Schnittstelle mit drei oder acht Parametern. Mit vielen weiteren Stopfen füllen http://www.vavr.io und http://github.com/jOOQ/jOOL die Lücken, etwa auch mit immutable Datenstrukturen oder neben dem Optional auch mit neuen Try-Monaden.
Entwickler, die noch tiefer in die Denkweise funktionaler Programmierung eintauchen möchten, können sich mit puren funktionalen Programmiersprachen wie Haskell beschäftigen und müssen dort ohne Seiteneffekte auskommen. Etwas einfacher für Java-Programmierer ist die Sprachfamilie ML, die auch imperative Elemente wie while-Schleifen bietet. Für Java-Programmierer wirkt das meist fremd – die hippen Programmiersprache Scala oder Kotlin vereinen objektorientierte und funktionale Programmierung nahezu perfekt. Java-Entwickler profitieren am meisten von den funktionalen Ansätzen bei der Stream-API, die schon kurz angerissen wurde und in meinem Buch »Java SE 9 Standard-Bibliothek« intensiv diskutiert wird.
Die Umsetzung der Lambda-Ausdrücke wurde sehr kurz angerissen. Ausführlicher macht das zum Beispiel http://dzone.com/articles/hacking-lambda-expressions-in-java.