© Excellent backgrounds/Shutterstock.com
Leserbrief zu „Benutzerdefinierte Kollektoren“

Java wird nie wirklich funktional


Dass die Themen des Java Magazins auch außerhalb der gedruckten Seiten, sei es auf Konferenzen oder auch auf Twitter, oft heftig diskutiert werden, freut uns als Redaktion immer sehr. Ist es doch ein Zeichen dafür, dass wir zusammen mit unseren Autoren den richtigen Themen auf den Grund gehen. Diesmal wandte sich unser Leser Dirk Detering direkt per Leserbrief an uns: Seine kritische Meinung zum Artikel „Richtig sammeln – Benutzerdefinierte Kollektoren“ aus dem Java Magazin 2.2016 und die Antwort der Autoren Angelika Langer und Klaus Kreft.

Der Leserbrief von Dirk Detering

Der Artikel von Frau Langer und Herrn Kreft zeigt wieder einmal deutlich, warum Java trotz aller Versuche, auch ein bisschen funktional zu sein, doch immer meilenweit davon weg bleiben wird. Denn trotz des Bemühens, uns die Freuden der neuen funktional-deklarativen (Stream-)Methoden nahezubringen, fühlten die Autoren sich doch genötigt, in ihren Implementierungen auf wenig abstrakten imperativen Code zurückzugreifen. Dieser mutet dann eher wie natives C an als wie eine Hochsprache mit funktionalen Ansätzen.

Das verleitet dann letztlich wohl dazu, dass auch sinnvolle Methoden der Standard-Library nicht genutzt werden und das DRY-Prinzip glatt unter den Teppich fällt. Das beste Beispiel ist die combine-Methode in Listing 2, das aus verschachtelten ifs, fors und Abfragen wie theList.size() == 0 besteht.

Ein funktionaler Programmierer wird bei einer solchen Implementierung nur seufzen und fragen, ob Java denn kein isEmpty kennt. Zudem würde er die Fälle der combine-Funktion nebeneinander stellen, statt sie zu schachteln und zu streuen. Auch würde er versuchen, den Aspekt der Fallunterscheidung (fängt die erste Zeile von other mit Leerzeichen an oder nicht?) an eine Funktion zu delegieren. Insbesondere, wo wir genau eine solche bereits mit Listing 1 vorliegen haben.

Leider bietet Java für Listen nicht die dem funktionalen Programmierer bekannten head- und tail-Funktionen, aber auch diese Logik ist in unserem Fall durchaus über die remove-Methode abbildbar (siehe Javadoc). Dann sähe die combine-Funktion wohl so aus:

publicTraceEntryCollectorAltcombine(TraceEntryCollectorAltother) { if (other.theList.isEmpty()) returnthis; if (this.theList.isEmpty()) returnother; this.accumulate(other.theList.remove(0).toString()); // behandle other // "head" this.theList.addAll(other.theList); // behandle other "tail" returnthis; }

Was ich durchaus lesbarer finde als den rein imperativen Stil.

Auch die acc...

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