Существует ли эквивалент Java, эквивалентный нулевому коалесцирующему оператору (??) в С#?

Можно ли сделать что-то похожее на следующий код в Java

int y = x ?? -1;

Подробнее о ??

Ответ 1

К сожалению - нет. Самое близкое, что вы можете сделать, это:

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

Конечно, вы можете обернуть это в библиотечные методы, если вы почувствуете необходимость (это вряд ли сильно сократит длину), но на уровне синтаксиса нет ничего более кратким.

Ответ 2

В Гуаве есть метод, который выполняет нечто похожее, называемый MoreObjects.firstNonNull(T, T).

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

Это более полезно, когда у вас есть что-то вроде

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

поскольку это избавляет вас от двухкратного вызова потенциально дорогостоящего метода или объявления локальной переменной в вашем коде.

Ответ 3

Короткий ответ: нет

Лучшее, что вы можете сделать, это создать статический метод утилиты (чтобы его можно было импортировать с помощью синтаксиса import static)

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

Вышеупомянутое эквивалентно методу Guava firstNonNull by @ColinD, но это может быть расширено в целом

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

Ответ 4

Нет, и имейте в виду, что обходные функции не совсем то же самое, истинные коллапсирующие операторы короткого замыкания, такие как && и || do, то есть он будет пытаться оценить только второе выражение, если первый имеет значение null.

Ответ 5

ObjectUtils.firstNonNull(T...), от Apache Commons Lang 3 - еще один вариант. Я предпочитаю это, потому что в отличие от Гуавы, этот метод не генерирует Exception. Он просто вернет null;

Ответ 6

Примитивы в Java никогда не могут быть нулевыми, поэтому оператор не имеет смысла концептуально. Однако классы-оболочки (Integer, Character и т.д.), А также любой другой экземплярный класс могут быть нулевыми.

Помимо этого факта, нет короткого синтаксиса для оператора нулевой коалесценции. Вы должны использовать расширенную форму.