In Java 8 möchte ich etwas mit einem Optional
Objekt tun, wenn es vorhanden ist, und etwas anderes tun, wenn es nicht vorhanden ist.
if (opt.isPresent()) {
System.out.println("found");
} else {
System.out.println("Not found");
}
Dies ist jedoch kein "funktionaler Stil".
Optional
hat eine ifPresent()
Methode, aber ich kann keine orElse()
Methode verketten.
Daher kann ich nicht schreiben:
opt.ifPresent( x -> System.out.println("found " + x))
.orElse( System.out.println("NOT FOUND"));
Als Antwort auf @assylias denke ich nicht, dass dies Optional.map()
für den folgenden Fall funktioniert:
opt.map( o -> {
System.out.println("while opt is present...");
o.setProperty(xxx);
dao.update(o);
return null;
}).orElseGet( () -> {
System.out.println("create new obj");
dao.save(new obj);
return null;
});
In diesem Fall opt
aktualisiere ich , wenn vorhanden, seine Eigenschaft und speichere in der Datenbank. Wenn es nicht verfügbar ist, erstelle ich eine neue obj
und speichere sie in der Datenbank.
Beachten Sie in den beiden Lambdas, dass ich zurückkehren muss null
.
Aber wenn opt
vorhanden, werden beide Lambdas ausgeführt. obj
wird aktualisiert und ein neues Objekt wird in der Datenbank gespeichert. Dies liegt am return null
im ersten Lambda. Und orElseGet()
wird weiterhin ausgeführt.
return null;
mit return o;
(beide). Ich habe jedoch das starke Gefühl, dass Sie am falschen Ort arbeiten. Sie sollten an der Stelle arbeiten, an der das hergestellt wurde Optional
. An dieser Stelle sollte es eine Möglichkeit geben, die gewünschte Operation ohne Zwischenprodukt durchzuführen Optional
.
ifPresent
widerspricht dem. Alle anderen Methoden beziehen sich auf den Wert und nicht auf Aktionen.