wake-up-neo.net

Gibt es einen Java äquivalent zu Null-Koaleszenzoperator (??) in C #?

Ist es möglich, etwas Ähnliches wie den folgenden Code in Java zu tun

int y = x ?? -1;

Mehr über ??

150
Nikita Ignatov

Traurigerweise Nein. Das Nächste, was Sie tun können, ist:

int y = (x != null) ? x : -1;

Natürlich können Sie dies in Bibliotheksmethoden umwandeln, wenn Sie dies für erforderlich halten (es ist unwahrscheinlich, dass sich die Länge erheblich verringert), aber auf Syntaxebene ist nichts prägnanteres verfügbar.

106
Andrzej Doyle

Guava hat eine ähnliche Methode namens MoreObjects.firstNonNull (T, T) .

Integer x = ...
int y = MoreObjects.firstNonNull(x, -1);

Dies ist hilfreicher, wenn Sie so etwas haben

int y = firstNonNull(calculateNullableValue(), -1);

dies erspart es Ihnen, die potenziell teure Methode zweimal aufzurufen oder eine lokale Variable in Ihrem Code zu deklarieren, um zweimal auf sie zu verweisen.

48
ColinD

Kurze Antwort: nein

Das Beste, was Sie tun können, ist, eine statische Dienstprogrammmethode zu erstellen (damit sie mit der Syntax import static Importiert werden kann).

public static <T> T coalesce(T one, T two)
{
    return one != null ? one : two;
}

Das oben Genannte ist äquivalent zu Guavas Methode firstNonNull von @ColinD, aber das kann allgemeiner erweitert werden

public static <T> T coalesce(T... params)
{
    for (T param : params)
        if (param != null)
            return param;
    return null;
}

Nein, und beachten Sie, dass Workaround-Funktionen nicht genau gleich sind, da ein echter Null-Koaleszenzoperator Kurzschlüsse wie und || enthält do, dh es wird nur versucht, den zweiten Ausdruck auszuwerten, wenn der erste null ist.

16
AkariAkaori

ObjectUtils.firstNonNull(T...) , von Apache Commons Lang 3 ist eine weitere Option. Ich bevorzuge dies, weil diese Methode im Gegensatz zu Guava kein Exception wirft. Es wird einfach null zurückgegeben;

5
mateuscb

Primitive in Java kann nie null sein, sodass diese Anweisung konzeptionell keinen Sinn ergibt. Die Wrapper-Klassen (Integer, Character usw.) sowie jede andere instanziierbare Klasse können null sein .

Abgesehen davon gibt es keine Kurzsyntax für einen Null-Koaleszenzoperator. Sie müssen das erweiterte Formular verwenden.

0
helloworld922