© Enkel/Shutterstock.com
Funktional mit Core Java

Einfach funktional


Immer öfter hört und liest man über funktionale Aspekte. In den letzten Jahren entstanden einige funktionale Sprachen für die JVM, und auch Java selbst hat immer mehr funktionale Elemente bekommen. Ein großer Schritt in diese Richtung war Java 8. In Java 9 wurde dieser Weg weitergegangen. Für die funktionalen Aspekte in Java braucht man keine große Bibliothek, denn selbst mit einfachen und kleinen Dingen kann man schon viel erreichen.

Grundsätzliche Elemente von Java, mit denen die funktionalen Aspekte umgesetzt werden, sind die Functional Interfaces und Lambda Expressions. Um diesen Aspekten ein wenig näher zu kommen, schauen wir uns eines der am längsten diskutierten Themen in Java an: die Exceptions. Egal, ob man sie mag oder nicht, sie sind da und wir müssen mit ihnen umgehen. Um uns anzusehen, wie es sich mit den Exceptions genau verhält, gehen wir von dem nachfolgenden Serviceinterface aus. Es ist ein Functional Interface, leider jedoch mit der Definition einer Exception in der Methodensignatur.

public static interface Service { String doWork(String txt) throws Exception; }

Wenn wir das so verwenden wollen, kommen wir im klassischen Stil zu einer einfachen Implementierung. Bitte beachten: Die Implementierung selbst hat definitiv keinen tieferen Sinn und ist nur ein Beispiel (Listing 1).

Listing 1

try { new Service() { @Override public String doWork(String txt) throws Exception { return txt.toUpperCase() + "-workedOn"; } }.doWork(""); } catch (Exception e) { e.printStackTrace(); }

Wir können hier schön den try-catch-Block erkennen, der dazu führt, dass wir uns überlegen müssen, wie wir mit einer Exception umgehen möchten. Eine Möglichkeit wäre es, die Exception einfach durchzureichen. Da es sich um ein Functional Interface handelt, können wir es auch als Lambda schreiben:

try { ((Service) txt -> txt.toUpperCase() + "-workedOn").doWork(""); } catch (Exception e) { e.printStackTrace(); }

Wenn man dieses Lambdakonstrukt auf Klassenebene definiert, sieht das Ganze erst einmal recht einfach aus:

public static Service serviceA = txt -> txt.toUpperCase() + "-workedOnA"; public static Service serviceB = txt -> txt.toUpperCase() + "-workedOnB";

Nur kommen dann leider wieder die try-catch-Blöcke zum Vorschein (Listing 2).

Listing 2

try { final String helloA = serviceA.doWork("Hello A"); } catch (Exception e) { e.printStackTrace(); } try { final String helloB = serviceB.doWork("Hello B"); } catch (Exception e) { e.printStackTrace(); }

Wir haben aber noch nic...

Exklusives Abo-Special

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