© Enkel/Shutterstock.com
Interview mit Jan Hauer

Funktional programmieren für Angeber


Java Magazin: Funktionale Programmierung ist lange Zeit hinter Objektorientierung zurückgetreten. Weshalb kommt die funktionale Programmierung aber so langsam wieder in Mode?

Jan Hauer: Aufgrund der modernen Entwicklungen sind wir viel stärker mit Event Streams und Parallelität konfrontiert. Für Event Streams sind funktionale Sprachen mit einem reichhaltigen API ausgestattet. Die größte Herausforderung von Parallelität sind geteilte veränderliche Variablen. Rein funktionales Programmieren verzichtet auf änderbare Variablen, effiziente Parallelisierung wird so begünstigt. Wir sind mit funktionalen Techniken bestens für aktuelle Entwicklungen wie Cloudinfrastruktur oder Microservices gerüstet.

JM: Wo hat funktionale Programmierung ihre Vorteile?

Hauer: Beim funktionalen Programmieren werden Seiteneffekte ausgeschlossen. Das zwingt uns zu sauberer Architektur und verbessert die Testbarkeit. So bei einem RetourService: Bestellungen, die retour gegangen sind und bezahlt wurden, müssen erstattet werden. Funktional trennen wir Logik von Daten und Abhängigkeiten: Predicate<Bestellung> isBezahltUndIsRetour = it -> it.isBezahlt() && it.isRetour(); So können wir das im Unit-Test vollständig testen. Die Methode erstatten wandelt sich entsprechend:

void erstatten(){ bestellungen.stream().filter(isBezahltUndIsRetour).forEach(bezahlService::erstatte); }

JM: Wie weit kommt man mit Java, wenn man funktional programmieren möchte? Es gibt seit Java 8 ja die Lambda Expressions.

Hauer: Java bringt mittlerweile vieles mit, in der täglichen Arbeit können wir die wesentlichen Techniken einsetzen. Im Vergleich zu rein funktionalen Sprachen fällt die aufwendigere Notation auf, und das Typsystem wurde nicht für eine funktionale Sprache entworfen. Somit wird Java immer „nur“ einen funktionalen Stil erlauben, aber nie eine echte Umsetzung des funktionalen Paradigmas.

JM: Was unterscheidet Java noch von einer „echten“ funktionalen Sprache wie Haskell oder LISP?

Hauer: Der Compiler unterstützt nicht wirklich. Typinferenz (aka var) ist wegen des Typsystems für Lambdaausdrücke nicht möglich. Vor allem können wir die Seiteneffektfreiheit nicht sicherstellen. Funktionale Programmierung in Java bleibt eine Teamkonvention und kann nicht mittels Schnittstellen kommuniziert werden.

JM: Deine JAX-Session hieß funktional Programmieren für Angeber – funktionale Programmierung soll esoterisch und schwer zugänglich zu sein. Stimmt das?

Hauer: In der Vergangenheit wurden funktionale Sprachen vor a...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang