findAny orElse nach filter
Ich bin mit der Stream-filter findAny.orElse
, aber es funktioniert nicht so, wie ich erwarte, so dass ich vermute, ich bin nicht zu verstehen, wie Sie wirklich funktioniert.
Hier mein code
return Stream.of(getObjectAttributeValue(product, matchCriteria.getFieldName()))
.map(o -> isIngredientRestricted(matchCriteria, (List<String>) o))
.filter(Boolean::valueOf)
.findAny().orElse(isCommercialHierarchyInfoRestricted(product, matchCriteria));
Im Grunde, was ich erwartet hatte war, dass wenn die erste Karte, geben einen Boolean false, dann wird es filter, so dass dann die findAny würde nicht gefunden werden, alle optional, so dass die orElse würde aufgerufen werden. Aber auch mit einem wahren in den filter der isCommercialHierarchyInfoRestricted aufgerufen.
Irgendeine Idee, was ich falsch mache?
orElse
aufgerufen wird, oderisCommercialHierarchyInfoRestricted
aufgerufen wird?.map(…).filter(Boolean::valueOf)
sieht unsinnig. Warum nicht einfach.filter(…)
in den ersten Platz, d.h..filter(o -> isIngredientRestricted(matchCriteria, (List<String>) o))
?- isCommercialHierarchyInfoRestricted aufgerufen. Vielleicht das größte problem hier ist, dass ich, sollten Sie nicht verwenden Stream
- Oh, wie ich sehe. Sie möchten die
boolean
Ergebnis als das Gesamtergebnis.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Tagir erklärt, mit
orElse(expression)
immer bewirkt, dass die Bewertung derexpression
vor dem aufrufen der MethodeorElse
und Sie müssenorElseGet(() -> expression)
statt aufschieben der Auswertung des Ausdrucks.Dies ist jedoch eine unnötige Nutzung der
Stream
API. Wenn Sie auswerten wollen, ein einzelnes Element, die Sie nicht brauchen, um erstellen a single-element-stream nur zu nennenfindAny
danach. Sie können eineOptional
in den ersten Platz:Allerdings, auch das ist eine unnötige Komplikation im Vergleich zu gleichwertigen gewöhnlichen Java-sprachkonstrukt:
Diese tut genau das gleiche, ohne die Notwendigkeit für zusätzliche APIs, die noch lambda-Ausdrücke. Die
||
Betreiber gewährleistet auch, dass der zweite Ausdruck nicht bekommen wird ausgewertet, wenn der erste ausgewertet wirdtrue
.Sie wirklich brauchen, zu verwenden
orElseGet
:In Java-Methode argument wird immer ausgewertet, bevor die Methode nennen, auch wenn es unnötig ist innerhalb der Methode, so kann man nicht umhin, die Bewertung der
orElse
argument. Das ist, warumorElseGet
vorhanden ist: das argument ist die Funktion und die Funktion kann nicht ausgeführt überhaupt, wenn es nicht notwendig ist.