© Excellent backgrounds/Shutterstock.com
Effective Java - Teil 8

Seiteneffekte


In unserer Reihe über das Stream API von Java 8 haben wir bereits erläutert, was Streams sind [1], wie man sie erzeugt und welche Operationen sie haben [2]. Wir haben gesehen, dass jeder Stream-Operation in der Regel eine Funktion übergeben wird, die wir üblicherweise als Lambda-Ausdruck oder Methodenreferenz ausdrücken. Diese Funktionen müssen gewissen Bedingungen bezüglich ihrer Seiteneffekte genügen. In diesem Artikel wollen wir uns ansehen, welche Anforderungen es sind und warum sie existieren.

Lambda-Ausdrücke in Java, wie auch das grundsätzliche Programmierparadigma der Streams, sind stark von den Ideen der funktionalen Programmierung abgeleitet. Ein wichtiges Grundprinzip der funktionalen Programmierung ist (sehr vereinfacht ausgedrückt): Seiteneffekte sind schlecht und deshalb weitestgehend unmöglich, oder falls möglich, doch zu vermeiden. Ein solcher Ansatz (seiteneffektfreie Programmierung) passt nicht so ganz zu Java als objektorientierte Programmiersprache. So hat Java zum Beispiel kein explizites Konzept für unveränderliche Typen, und mit final hat es auch nur ein sehr schwaches Konzept für unveränderliche Variablen.

Was blieb also anderes, als einen pragmatischen Kompromiss zu suchen. Das bedeutet im Fall von Lambda-Ausdrücken (und Methodenreferenzen), die an Stream-Operationen übergeben werden: Manche Seiteneffekte sind zulässig, manche sind ganz verboten. Manche Steiteneffekte sind zwar zulässig, aber wenn möglich zu vermeiden. Zum Teil hängt dies auch noch von der spezifischen Stream-Operation ab.

Schauen wir uns die Details an. Seiteneffekte, die verboten sind, werden in der Javadoc der Stream-Operation bei der Beschreibung des Funktionsparameters aufgelistet. Zum Beispiel findet man in der Javadoc der Methode filter() zum Parameter predicate folgende Erläuterung:

predicate - a non-interfering, stateless predicate to apply to each element todetermine if it should be included

Die entscheidenden Worte sind non-interfering und stateless. Sie beschreiben die verbotenen Seiteneffekte. Schauen wir sie uns genauer an. Fangen wir dabei mit Statelessness an.

Statelessness

Die Statelessness (Zustandslosigkeit) ist eine Anforderung, die von den meisten Funktionen verlangt wird, die an Stream-Operationen übergeben werden. Ausgenommen sind nur die Funktionen, die an forEach(), for­EachOrdered() und peek() übergeben werden.

Zustandslosigkeit heißt, dass die Ausführungen der Funktion auf den verschiedenen Sequenzelementen nicht voneinander abhängig se...

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