web-dev-qa-db-fra.com

Existe-t-il un Java équivalent à l'opérateur de coalescence nul (??) en C #?

Est-il possible de faire quelque chose de similaire au code suivant en Java

int y = x ?? -1;

Plus à propos ??

150
Nikita Ignatov

Malheureusement non. Le plus proche que vous puissiez faire est:

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

Bien sûr, vous pouvez intégrer cela dans les méthodes de bibliothèque si vous en sentez le besoin (il est peu probable que vous réduisiez la longueur), mais au niveau syntaxique, rien de plus succinct n'est disponible.

106
Andrzej Doyle

Guava a une méthode qui fait quelque chose de similaire appelé MoreObjects.firstNonNull (T, T) .

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

Ceci est plus utile lorsque vous avez quelque chose comme

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

dans la mesure où cela vous évite d'appeler deux fois la méthode potentiellement coûteuse ou de déclarer une variable locale dans votre code à référencer deux fois.

48
ColinD

Réponse courte: non

Le mieux que vous puissiez faire est de créer une méthode d’utilité statique (afin de l’importer à l’aide de import static syntaxe)

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

Ce qui précède est équivalent à la méthode de Guava firstNonNull de @ColinD, mais cela peut être étendu de manière plus générale

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

Non, et sachez que les fonctions de solution de contournement ne sont pas exactement les mêmes, un véritable court-circuit opérateur de fusion nul tel que && et || do, ce qui signifie qu'il ne tentera d'évaluer la deuxième expression que si la première est nulle.

16
AkariAkaori

ObjectUtils.firstNonNull(T...) , d’Apache Commons Lang 3 est une autre option. Je préfère cela car contrairement à Guava, cette méthode ne jette pas un Exception. Il retournera simplement null;

5
mateuscb

Les primitives dans Java ne peuvent jamais être null, cette instruction n'a donc aucun sens conceptuellement. Cependant, les classes wrapper (Integer, Character, etc.), ainsi que toute autre classe instanciable peuvent être null .

Outre ce fait, il n'y a pas de syntaxe abrégée pour un opérateur de coalescence nul. Vous devez utiliser le formulaire développé.

0
helloworld922