2016-11-07 1 views
0

Ich benutze Stream mit findFirst(), die optional zurückgibt, aber auch wenn mein Stream vielleicht gar nichts aussendet, so dass ich oder Operator unten anzeige.FindFirst- und orElse-Operatoren geben unterschiedliche Klassen zurück

Das Problem besteht darin, dass orElse nicht einen optionalen, sondern den Klassentyp zurückgibt, den der optionale Operator findFirst umbrochen hat.

 def optional = categories.categories.stream() 
       .filter { category -> category.name == selCategory } 
       .map { category -> loadUniqueIds.call(category) } 
       .map { UUIDs -> new JsonArray(UUIDs) } 
       .findFirst().orElse{Optional.of(new JsonArray())} 
     optional.get() 

Also ich am Ende ohne die Möglichkeit der Verwendung findFirst und orElse.

Was mache ich hier falsch?

Dank

UPDATE:

ich die OrElse nach dem findfirst Entfernen am Ende und überprüfen Sie die später optional

 optional.isPresent() ? optional.get(): new JsonArray() 

Wie dem auch sei, wenn jemand eine bessere/elegantere Lösung hat, lassen Sie es mich wissen .

Grüße.

+1

Was soll 'def optional' in Java sein? – khelwood

+0

Das ist groovy, aber ich benutze Java 8 stream – paul

Antwort

4

Wenn Sie findFirst() Sie erhalten eine Optional, aber wenn Sie orElse() verwenden (die Optional ‚s Methode ist) können Sie die ungeöffneten Objekt zu erhalten, da es keine Möglichkeit gibt, können Sie eine Optional mehr zu bekommen. Entweder erhalten Sie, was in findFirst() unwrapped oder gefunden wurde, Sie erhalten den "Standard" -Wert von orElse().

Es ist nicht sinnvoll, ein optionales von orElse() zurückzugeben, weil es immer garantiert ist zu existieren.

Optional.of("foo").orElse("bar"); // Returns String "foo" 
Optional.empty().orElse("bar"); // Returns String "bar" 
+0

Danke, das ist was ich – paul

+0

wahrscheinlich am besten zu verwenden 'orElseGet {-> neue JsonArray()}' in diesem Fall, so dass Sie keine neue machen Jedes Mal, wenn es angerufen wird, egal was passiert –

Verwandte Themen