czy istnieje odpowiednik Javy dla operatora koalescencyjnego null (??) w C#? [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak uzyskać pierwszą wartość non-null w Javie? (12 odpowiedzi) Zamknięty 3 lata temu .

Czy można zrobić coś podobnego do poniższego kodu w Javie

int y = x ?? -1;

Więcej o ??

Author: Ivar, 2011-03-07

6 answers

Niestety-nie. Najbliższe co możesz zrobić to:

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

Oczywiście, możesz zawinąć to w metody biblioteczne, jeśli czujesz taką potrzebę (jest mało prawdopodobne, aby znacznie zmniejszyć długość), ale na poziomie składni nie ma nic bardziej zwięzłego dostępnego.

 147
Author: Andrzej Doyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-07 17:36:55

Guava ma metodę, która robi coś podobnego o nazwie MoreObjects.firstNonNull (T,T) .

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

To jest bardziej pomocne, gdy masz coś takiego

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

Ponieważ pozwala to uniknąć dwukrotnego wywołania potencjalnie drogiej metody lub dwukrotnego deklarowania zmiennej lokalnej w kodzie jako odwołania się.

 55
Author: ColinD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-21 07:23:28

Krótka odpowiedź: Nie

Najlepsze, co możesz zrobić, to utworzyć statyczną metodę narzędzia (tak, aby można ją zaimportować za pomocą składni import static)

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

Powyższe jest równoważne metodzie Guava firstNonNull przez @ ColinD, ale można ją rozszerzyć bardziej ogólnie

public static <T> T coalesce(T... params)
{
    for (T param : params)
        if (param != null)
            return param;
    return null;
}
 39
Author: usr-local-ΕΨΗΕΛΩΝ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-26 07:57:42

Nie, i należy pamiętać, że funkcje obejścia nie są dokładnie takie same, prawdziwy operator null łączący zwarcia, takie jak & & i / / do, co oznacza, że będzie próbował ocenić drugie wyrażenie tylko wtedy, gdy pierwsze jest null.

 20
Author: AkariAkaori,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 18:06:06

ObjectUtils.firstNonNull(T...), z Apache Commons Lang 3 jest inną opcją. Wolę ten becuase w przeciwieństwie do guawy, ta metoda nie rzuca Exception. Po prostu zwróci null;

 9
Author: mateuscb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-26 22:45:08

Prymitywy w Javie nigdy nie mogą być null, więc stwierdzenie to nie ma sensu koncepcyjnie. Jednak klasy wrappera (Integer, Character, itd.), podobnie jak każda inna instancyjna klasa może być null.

Poza tym, nie ma składni krótkiej ręki dla operatora koalescencyjnego null. Musisz użyć rozszerzonego formularza.

 0
Author: helloworld922,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-19 17:01:18