Aber leider kommen noch zwei Anrufe dazu getChicken().
Natürlich könnten wir eine lokale Variable zuweisen und dann den ternären Operator erneut verwenden, um sie zuzuweisen, wenn sie nicht null ist, aber das sind zwei Zeilen und nicht so hübsch:
Variable var = ein Wert, wenn ein Wert nicht null ist ODER ein anderer Wert;
Und ich schätze, ich spreche hier nur von Syntax, nachdem der Code kompiliert ist, macht es wahrscheinlich keinen großen Unterschied, wie der Code in Bezug auf die Leistung geschrieben wurde.
Da dies ein so allgemeiner Code ist, wäre es großartig, einen Einzeiler zu haben, um ihn zu schreiben.
Haben andere Sprachen diese Funktion?
Nicht wirklich eine Antwort, aber wenn Ihr Code voller solcher Codeblöcke ist, die fehlende Werte durch Standardwerte ersetzen, liegt wahrscheinlich ein Problem im Design Ihrer API vor.
– Denys Séguret
9. April 2015 um 11:50 Uhr
jhyot
Gleiches Prinzip wie Lokis Antwort, aber kürzer. Denken Sie nur daran, dass kürzer nicht automatisch besser bedeutet.
Hinweis: Diese Verwendung von Optional wird ausdrücklich von den Architekten des JDK und den Designern des optionalen Features abgeraten. Sie weisen jedes Mal ein frisches Objekt zu und werfen es sofort weg. Aber auf der anderen Seite kann es durchaus lesbar sein.
Wenn getFreerangeChicken() ist kostspielig, stellen Sie sicher, dass Sie es verwenden dinner = Optional.ofNullable(cage.getChicken()) .orElseGet(()->getFreerangeChicken());
– Matheus208
30. November 2017 um 14:04 Uhr
Dies war in einem Websocket-Client nützlich: javax.websocket.CloseReason.getReasonPhrase() kehrt zurück null auf erfolgreiche Nachrichten
– Stuart Cardall
14. Juni 2018 um 11:10 Uhr
Schade, dass davon abgeraten wird. Ich mag es irgendwie.
– Pieter de Bié
6. Juli 2018 um 13:19 Uhr
@PieterDeBie Warum wird davon abgeraten?
– Heather Sawatsky
27. November 2018 um 21:14 Uhr
@HeatherSawatsky, ich denke, nur weil Sie, wie das Poster dieser Antwort feststellt, jedes Mal, wenn Sie es verwenden, ein völlig neues optionales Objekt zuweisen, also ist es teurer, als nur zu prüfen, ob es selbst null ist.
– Alex Pritchard
1. April 2020 um 14:45 Uhr
Sergej Kalinitschenko
Java fehlt der Coalesce-Operator, daher ist Ihr Code mit einem expliziten Temporär Ihre beste Wahl für eine Zuweisung mit einem einzigen Aufruf.
Sie können die Ergebnisvariable wie folgt als temporäre verwenden:
public class Main {
public static void main(String[] args) {
//example call, the methods are just dumb templates, note they are static
FutureMeal meal = getChicken().orElse(getFreeRangeChicken());
//another possible way to call this having static methods is
FutureMeal meal = getChicken().orElseGet(Main::getFreeRangeChicken); //method reference
//or if you would use a Instance of Main and call getChicken and getFreeRangeChicken
// as nonstatic methods (assume static would be replaced with public for this)
Main m = new Main();
FutureMeal meal = m.getChicken().orElseGet(m::getFreeRangeChicken); //method reference
//or
FutureMeal meal = m.getChicken().orElse(m.getFreeRangeChicken()); //method call
}
static Optional<FutureMeal> getChicken(){
//instead of returning null, you would return Optional.empty()
//here I just return it to demonstrate
return Optional.empty();
//if you would return a valid object the following comment would be the code
//FutureMeal ret = new FutureMeal(); //your return object
//return Optional.of(ret);
}
static FutureMeal getFreeRangeChicken(){
return new FutureMeal();
}
}
Sie würden eine Logik für implementieren getChicken entweder zurückgeben Optional.empty() statt null, oder Optional.of(myReturnObject)wo myReturnObject ist dein chicken.
Dann kannst du anrufen getChicken() und ob es zurückkommen würde Optional.empty() das orElse(fallback) würde Ihnen geben, was auch immer der Fallback wäre, in Ihrem Fall die zweite Methode.
Levit
Verwenden Sie Ihre eigenen
public static <T> T defaultWhenNull(@Nullable T object, @NonNull T def) {
return (object == null) ? def : object;
}
Beispiel:
defaultWhenNull(getNullableString(), "");
Vorteile
Funktioniert, wenn Sie nicht in Java8 entwickeln
Funktioniert für die Android-Entwicklung mit Unterstützung für vor API 24 Geräte
Benötigt keine externe Bibliothek
Nachteile
Wertet immer die aus default value (im Gegensatz zu cond ? nonNull() : notEvaluated())
Dies könnte umgangen werden, indem ein Callable anstelle eines Standardwerts übergeben wird, was es jedoch etwas komplizierter und weniger dynamisch macht (z. B. wenn die Leistung ein Problem ist).
Auf den gleichen Nachteil stößt man übrigens bei der Nutzung Optional.orElse() 😉
Abgesehen von fehlenden geschweiften Klammern sollte die Verwendung einer Zuweisung innerhalb einer Bewertung meiner Meinung nach nicht legal sein. Dieser Code ist einfach zu schwer zu lesen und zu leicht falsch zu machen.
– Jan Groth
9. April 2015 um 12:12 Uhr
Obwohl dies die Frage möglicherweise beantwortet, ist es immer eine gute Idee, Ihrer Antwort einen Text hinzuzufügen, um zu erklären, was Sie tun. Lesen Sie, wie Sie eine gute Antwort schreiben.
– Jörgen R
9. April 2015 um 12:33 Uhr
Ich finde den ersten Teil der Antwort die beste Lösung, er ist klar und leicht verständlich und es wird nur ein Anruf bei getChicken getätigt
– NikkyD
14. September 2017 um 15:49 Uhr
12579000cookie-checkÜberprüfen Sie, ob der zurückgegebene Wert nicht null ist, und weisen Sie ihn gegebenenfalls in einer Zeile mit einem Methodenaufruf zuyes
Nicht wirklich eine Antwort, aber wenn Ihr Code voller solcher Codeblöcke ist, die fehlende Werte durch Standardwerte ersetzen, liegt wahrscheinlich ein Problem im Design Ihrer API vor.
– Denys Séguret
9. April 2015 um 11:50 Uhr