Lesbarkeit von Streams

Monokuma

Aktives Mitglied
Frage dient nur dem Verständnis der folgenden Diskussion. Bei Antworten auf die eigentliche Frage bitte hier antworten:
https://www.java-forum.org/thema/foreach-schleifen-in-streams-umaendern.191171/



Hallo! Ich hab ein Problem bei meinem Versuch eine Foreach Schleife in einen Stream umzuwandeln.
Java:
for (PickOrder pickOrder : pickOrders) {
            for (PickOrderLine pickOrderLine : pickOrder.getPickOrderLines()) {
                if (pickOrderLine.getQuantity() > quantityOnHand.get(pickOrderLine.getProductCode())) {
                    return productCollection.findByCode(pickOrderLine.getProductCode());
                }
            }
       }
Das ist die foreach Schleife und ich hab schon einen Versuch getätigt, aber der funktioniert nicht.

Java:
pickOrders.stream()
                .flatMap(pickOrder -> pickOrder.getPickOrderLines().stream())
                .filter(pickOrderLine -> pickOrderLine.getQuantity() > quantityOnHand.get(pickOrderLine.getProductCode()))
                .collect(Collectors.toList()).stream().findFirst();

Ich würde mich sehr über Hilfe freuen. Ich hab noch andere foreach Schleifen, bei denen ich auch die Hilfe brauche, aber eins nach dem anderen.
 
Zuletzt bearbeitet von einem Moderator:

httpdigest

Top Contributor
Was genau geht denn daran nicht? Sieht richtig aus. Nur, dass du halt aus dem gesamten Ausdruck ein Optional bekommst. Aber da kannst du ja mit .orElse(<wasDuZurückGibstWennKeinWertGefundenWird>) auch einfach das zurückgeben, was deine Methode nach der Schleife zurückgegeben hätte.
Und, du brauchst auch eigentlich kein collect:
Java:
return pickOrders
      .stream()
      .flatMap(po -> po.getPickOrderLines().stream())
      .filter(pol -> pol.getQuantity() > quantityOnHand.get(pol.getProductCode()))
      .findFirst()
      .orElse(null);
 

Thallius

Top Contributor
Da frage ich mich warum? Der Code oben ist super lesbar und für jeden verständlich und der Code unten erinnert mich an Die Zeiten wo wir aus Spaß komplette Programme in einer Zeile C geschrieben haben

so, und nun Mr. Brown. Erklär mir warum ich das falsch sehe...
 
K

kneitzel

Gast
Da frage ich mich warum? Der Code oben ist super lesbar und für jeden verständlich und der Code unten erinnert mich an Die Zeiten wo wir aus Spaß komplette Programme in einer Zeile C geschrieben haben

so, und nun Mr. Brown. Erklär mir warum ich das falsch sehe...
Also ich in vielen Fällen hier im Forum ganz Deiner Meinung. Ich bevorzuge in der Regel auch eher Lösungen, bei denen dann mehr durch objektorientierung und Methoden sauber verständlicher Code geschrieben wird.

Aber das hier ist durchaus ein Fall, bei dem ich den Stream sehr übersichtlich finde. Es hat halt nur das flatMap, filter und findFirst... Das würde ich durchaus als ok und einfach lesbar ansehen. Und besser als den ersten Code - da wäre ein Refactoring schon angesagt ...
 

LimDul

Top Contributor
Ich find die Stream Variante - so eingerückt, wie von @httpdigest mittlerweile lesbarer. Vor allem, wenn noch mehr Filter Kriterien oder maps dazukommen, wird die for-each Schleife immer tiefer verschachtelt. Und dann schlagen schnell Tools wie Checkstyle an, die sagen "nicht mehr als Tiefe X".


Default sind maximal 2 verschachtelte schleifen + 2 verschachtelte Ifs
 

Thallius

Top Contributor
Ich find die Stream Variante - so eingerückt, wie von @httpdigest mittlerweile lesbarer. Vor allem, wenn noch mehr Filter Kriterien oder maps dazukommen, wird die for-each Schleife immer tiefer verschachtelt. Und dann schlagen schnell Tools wie Checkstyle an, die sagen "nicht mehr als Tiefe X".


Default sind maximal 2 verschachtelte schleifen + 2 verschachtelte Ifs

und wenn ich nun 15 map und Filter hier hintereinander packe um damit 15 for schleifen verschachtelungen zu ersetzen dann ist es dadurch besserer Code weil er mit checkstyle nicht gefunden wird? Also irgendwie ist das doch nur ein “ich mache mir mein Leben so wie es mir gefällt“ aber keine echte lösung
 
K

kneitzel

Gast
Die Aussage ist doch die Lesbarkeit. Der Hinweis auf Checkstyle ist doch nur um die Aussage etwas zu bekräftigen.

Und so verschachtelten Code ist schlecht lesbar. Daher ist da ein Refactoring angebracht. (Meiner Meinung nach)

Wie genau du das veränderst ist da erst einmal nebensächlich. Eine Stream Lösung ist durchaus denkbar - ggf. zusammen mit eben separaten Prädikat, damit der Filter gut lesbar wird und so ...
Aber ob Stream oder nicht Stream ist da erst einmal nebensächlich.

So Clean Code Diskussionen hatten wir doch schon öfters. Und die Frage ist doch, was für Anforderungen man an die stellt, die den Code lesen können sollen. Da kann sogar ein kompletter Verzicht auf Streams denkbar sein. Aber das, was @httpdiggest gebracht hat, ist durchaus lesbar.

Was man nun besser findet, das kann und muss jeder für sich entscheiden. Ich unterstütze Deine Position, die den Einsatz von Streams kritisch hinterfragt. Aber als Übung kann es gut sein.... ich schau mir auch oft genug Stream und Non Stream Lösung an um zu schauen, was besser lesbar ist...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Lesbarkeit von Streams Allgemeine Java-Themen 5
mihe7 Lesbarkeit von Streams Allgemeine Java-Themen 5
G Stil-und Lesbarkeit des Codes Allgemeine Java-Themen 18
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
Z Mit Java 8+ Streams Zeilen nummern zu Zeilen hinzufügen Allgemeine Java-Themen 17
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
Monokuma Foreach Schleifen in Streams umändern Allgemeine Java-Themen 23
J Streams Allgemeine Java-Themen 6
LimDul Streams und Exception Allgemeine Java-Themen 8
LimDul Mittels Streams aus Strings A B C den String A, B und C machen Allgemeine Java-Themen 12
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50
N Streams wann .filtern? Allgemeine Java-Themen 2
A Lambda und Streams verstehen Allgemeine Java-Themen 4
J IO Streams Allgemeine Java-Themen 13
M Wie funktionieren parallele Java Streams? Allgemeine Java-Themen 1
R Collections BiPredicate in Java 8 Streams Allgemeine Java-Themen 7
F Umgehen mit übergebenen Streams Allgemeine Java-Themen 3
hdi Überwachen des err-Streams? Allgemeine Java-Themen 8
N read streams umleiten Allgemeine Java-Themen 2
DEvent GZIP Streams und gzip Allgemeine Java-Themen 2
S Streams zusammenfügen Allgemeine Java-Themen 4
J Objekt in Datei speichern mittels Streams Allgemeine Java-Themen 6
F Double mit Streams aus Datei einlesen Allgemeine Java-Themen 3
C in Streams Allgemeine Java-Themen 4
M Sind Streams asynchron? Allgemeine Java-Themen 2
Saxony DOS Konsole und deren Streams Allgemeine Java-Themen 5
B Probleme mit Streams Allgemeine Java-Themen 5
T Zwei Streams verbinden Allgemeine Java-Themen 3
L Die Wahl des richtigen Streams? Allgemeine Java-Themen 3
G Video Streams mit Servlets Allgemeine Java-Themen 3
P Streams per Mail mit JavaMailAPI versenden Allgemeine Java-Themen 3
A Streams: merkwürdiges Verhalten Allgemeine Java-Themen 7
A Streams - merkwürdiges Verhalten Allgemeine Java-Themen 2
thE_29 Problem mit Streams Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben