In Java 8 möchte ich etwas mit einem OptionalObjekt 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".
Optionalhat 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 optaktualisiere ich , wenn vorhanden, seine Eigenschaft und speichere in der Datenbank. Wenn es nicht verfügbar ist, erstelle ich eine neue objund speichere sie in der Datenbank.
Beachten Sie in den beiden Lambdas, dass ich zurückkehren muss null.
Aber wenn optvorhanden, werden beide Lambdas ausgeführt. objwird aktualisiert und ein neues Objekt wird in der Datenbank gespeichert. Dies liegt am return nullim 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.
ifPresentwiderspricht dem. Alle anderen Methoden beziehen sich auf den Wert und nicht auf Aktionen.