Ich versuche die ifPresent()
Methode der Optional
API in Java 8 zu verstehen .
Ich habe eine einfache Logik:
Optional<User> user=...
user.ifPresent(doSomethingWithUser(user.get()));
Dies führt jedoch zu einem Kompilierungsfehler:
ifPresent(java.util.functionError:(186, 74) java: 'void' type not allowed here)
Natürlich kann ich so etwas machen:
if(user.isPresent())
{
doSomethingWithUser(user.get());
}
Aber das ist genau wie ein überfüllter null
Scheck.
Wenn ich den Code in diesen ändere:
user.ifPresent(new Consumer<User>() {
@Override public void accept(User user) {
doSomethingWithUser(user.get());
}
});
Der Code wird schmutziger, was mich daran erinnert, zum alten null
Scheck zurückzukehren.
Irgendwelche Ideen?
user.ifPresent(this::doSomethingWithUser);
Optional<User>
häufig nicht in einer lokalen Variablen speichern. Verketten Sie einfach die Methodenaufrufe:funcThatMightReturnUser().ifPresent(this::doSomethingWithUser);
Zusätzlich zur Antwort von @ JBNizet besteht mein allgemeiner Anwendungsfall
ifPresent
darin, zu kombinieren.isPresent()
und.get()
:Alter Weg:
Neuer Weg:
Das ist für mich intuitiver.
quelle
Warum komplizierten Code schreiben, wenn Sie es einfach machen könnten?
In der Tat, wenn Sie die
Optional
Klasse unbedingt verwenden wollen , ist der einfachste Code der , den Sie bereits geschrieben haben ...Dieser Code hat die Vorteile des Seins
Nur weil Oracle die
Optional
Klasse in Java 8 hinzugefügt hat, bedeutet dies nicht, dass diese Klasse in allen Situationen verwendet werden muss.quelle
Verwenden Sie flatMap. Wenn ein Wert vorhanden ist, gibt flatMap einen sequentiellen Stream zurück, der nur diesen Wert enthält. Andernfalls wird ein leerer Stream zurückgegeben. Es besteht also keine Notwendigkeit zu verwenden
ifPresent()
. Beispiel:quelle
Sie können eine Methodenreferenz wie folgt verwenden:
Methode
ifPresent()
getConsumer
object als Paremeter und (von JavaDoc ): "Wenn ein Wert vorhanden ist, rufen Sie den angegebenen Consumer mit dem Wert auf." Wert es ist Ihre Variableuser
.Wenn sich diese Methode
doSomethingWithUser
in derUser
Klasse befindet und nichtstatic
, können Sie die Methodenreferenz wie folgt verwenden:quelle
user.ifPresent(new ClassNameWhereMethodIs()::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
. Ich werde es meiner Antwort hinzufügen.