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:
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);
 
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...
 
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 ...
 
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
 
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
 
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...
 

Neue Themen


Zurück
Oben