Samstag, 1. August 2020

Java Streams

Ich habe mich lange gedrückt um einen Artikel über Java Streams zu schreiben, jetzt nach Jahren ist es so weit. 

Als ich das erste Mal Java Streams sah, ich glaube es war in einem Meetup, kamen mir zwei Gedanken:
  1. Wow, cool
  2. Welches Problem wird durch Java Streams gelöst.#
  3. Parallelisierung für lau
In den nächsten Jahren sickerten die Streams so in die allgemeine Java Programmierung. Streams waren ja nicht Neues, ich habe Streams (Pipes) exzessiv mit BASH and Splunk eingesetzt.  

Meine anfänglich Begeisterung sank recht schnell auf den Nullpunkt. Java Streams schienen in der Praxis mehr neue Probleme zu verursachen, als sie lösten, und welches Problem sollten Streams nochmal lösen.

Jetzt nachdem der Hype weitergezogen ist, hier in aller Ruhe ein paar Tipps und Antworten zu Java Streams. 

Frage: Welches Problem löst Java Streams?

Streams sind eine weitere From oder Alternative zu Schleifen (for, while). Sie bieten zwei Vorteile gegenüber den normalen Schleifen. Bei grossen Datenmengen kann man Streams parallelisieren, was auf Multi-Prozessorsystemen einen Geschwindigkeitsvorteil bringt. Dazu zwei Anmerkungen, in Cloud Umgebungen ala Marathon, Kubernetes, AWS - schaut in euere Configs ob ihr Überhaupt mehr als eine CPU habt, wenn nicht, bringt die Parallelisieren von Streams nichts. Die zweite Anmerkung, nur bei grossen Datenmengen ist die Parallelisieren sinnvoll, weil sonst der Overhead durch die Verteilung des Codes und der Daten über mehrere Cores die Geschwindigkeitsgewinn der Parallelisieren aufrisst.

Hier ein Beispiel für eine super simple Parallelisierung mit Java Streams: https://www.adam-bien.com/roller/abien/entry/java_8_from_ordinary_for


Das zweite Vorteil von Java Streams gegenüber normalen Schleifen ist, das die Abarbeitung strukturierter erfolgt (stream -> (filter -> map)* -> collect). Das war für mich eher selten das Problem, aber es eindeutig ist das ein Vorteil von Java Streams. Das Problem sind nicht die Streams, das Problem sind die Programmier die mit Java vertraut sind. Sie fangen jetzt an das bekannte Exception Handling und Verzweigungen in den Streams einzubauen. Das ist generell ein Fehler oder besser der Fehler beim Umgang mit Streams. 

Streams behandeln nur positive Fälle. Ein Exception Handling oder ein Handling von Alternativen führt zu extrem schwierig zu lesendem Code. So etwas sollte in einem zweiten Stream gemacht werden. Streams sind verzweigungslos. Das macht sie so elegant und verständlich. 

Java Entwickler die es gewohnt sind Exceptions nahe am Ursprung zu behandeln, müssen umdenken und diese Funktionen in Filter und einem zweiten Stream auslagern.


Zusammenfassung:

  1. Streams sind ein sinnvolles Pattern für die Softwareentwicklung
  2. Wer Pipes toll fand wird Streams lieben
  3. Streams sind verzweigungsfrei zu bauen, entsprechende Filter, ggf. Mappings und alternative Streams sind umzusetzen

Keine Kommentare:

Kommentar veröffentlichen