Java 8 optional: ifPresent-Rückgabeobjekt oder ElseThrow-Ausnahme
Lesezeit: 2 Minuten
Ich versuche so etwas zu machen:
private String getStringIfObjectIsPresent(Optional<Object> object){
object.ifPresent(() ->{
String result = "result";
//some logic with result and return it
return result;
}).orElseThrow(MyCustomException::new);
}
Dies wird nicht funktionieren, da ifPresent die Consumer-Funktionsschnittstelle als Parameter verwendet, die void accept(T t) hat. Es kann keinen Wert zurückgeben. Gibt es eine andere Möglichkeit, es zu tun?
Mögliches Duplikat von Proper use of Optional.ifPresent()
– Krishnanuni PV
5. Januar 2017 um 13:05 Uhr
Roland
Eigentlich suchst du: Optional.map. Ihr Code würde dann so aussehen:
object.map(o -> "result" /* or your function */)
.orElseThrow(MyCustomException::new);
Auf das Weitergeben würde ich lieber verzichten Optional falls Sie können. Am Ende gewinnen Sie nichts mit einem Optional hier. Eine etwas andere Variante:
public String getString(Object yourObject) {
if (Objects.isNull(yourObject)) { // or use requireNonNull instead if NullPointerException suffices
throw new MyCustomException();
}
String result = ...
// your string mapping function
return result;
}
Wenn Sie die bereits haben Optional-Objekt Aufgrund eines anderen Anrufs würde ich dir trotzdem empfehlen, das zu verwenden map-Methode, statt isPresentetc. aus dem einzigen Grund, dass ich es lesbarer finde (eindeutig eine subjektive Entscheidung ;-)).
Hier zwei Möglichkeiten:
Ersetzen ifPresent mit map und verwenden Function Anstatt von Consumer
private String getStringIfObjectIsPresent(Optional<Object> object) {
return object
.map(obj -> {
String result = "result";
//some logic with result and return it
return result;
})
.orElseThrow(MyCustomException::new);
}
Verwenden isPresent:
private String getStringIfObjectIsPresent(Optional<Object> object) {
if (object.isPresent()) {
String result = "result";
//some logic with result and return it
return result;
} else {
throw new MyCustomException();
}
}
Beachten Sie, dass die zweite Option nicht die empfohlene Methode zur Verwendung von Optionals ist
– Kartik Chugh
19. Juni 2020 um 21:40 Uhr
map ist für diese Verwendung weder vorgesehen noch ausgelegt. Es hat immer einen Rückgabetyp, also ist es besser zu tun return someOptional.orElseThrow(() -> ...); — es ist unklar, ob OP etwas zurückgeben wollte oder nicht.
– Josch M.
4. März 2021 um 1:17 Uhr
Dies ist eine bessere Antwort auf die Kartenversion.
– Raichu
1. August 2021 um 5:16 Uhr
Verwenden Sie die map-Funktion stattdessen. Es transformiert den Wert innerhalb des optionalen.
So was:
private String getStringIfObjectIsPresent(Optional<Object> object) {
return object.map(() -> {
String result = "result";
//some logic with result and return it
return result;
}).orElseThrow(MyCustomException::new);
}
Ich bevorzuge die Zuordnung, nachdem ich sichergestellt habe, dass der Wert verfügbar ist
private String getStringIfObjectIsPresent(Optional<Object> object) {
Object ob = object.orElseThrow(MyCustomException::new);
// do your mapping with ob
String result = your-map-function(ob);
return result;
}
Das Beispiel, das Sie nennen, ist kein gutes Beispiel. Optional sollte nicht als Parameter an eine andere Funktion gesendet werden. Gute Praxis ist immer das Senden von Nicht-Null-Parametern an die Funktion. Damit wir immer wissen, dass die Eingabe nicht null sein wird. Dies kann unsere Code-Unsicherheit verringern.
11800500cookie-checkJava 8 optional: ifPresent-Rückgabeobjekt oder ElseThrow-Ausnahmeyes
Mögliches Duplikat von Proper use of Optional.ifPresent()
– Krishnanuni PV
5. Januar 2017 um 13:05 Uhr