Можно ли сделать что-то похожее на следующий код в Java
int y = x ?? -1;
К сожалению - нет. Самое близкое, что вы можете сделать, это:
int y = (x != null) ? x : -1;
Конечно, вы можете обернуть это в библиотечные методы, если вы почувствуете необходимость (это вряд ли сильно сократит длину), но на уровне синтаксиса нет ничего более кратким.
В Гуаве есть метод, который выполняет нечто похожее, называемый MoreObjects.firstNonNull(T, T).
Integer x = ...
int y = MoreObjects.firstNonNull(x, -1);
Это более полезно, когда у вас есть что-то вроде
int y = firstNonNull(calculateNullableValue(), -1);
поскольку это избавляет вас от двухкратного вызова потенциально дорогостоящего метода или объявления локальной переменной в вашем коде.
Короткий ответ: нет
Лучшее, что вы можете сделать, это создать статический метод утилиты (чтобы его можно было импортировать с помощью синтаксиса 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;
}
Нет, и имейте в виду, что обходные функции не совсем то же самое, истинные коллапсирующие операторы короткого замыкания, такие как && и || do, то есть он будет пытаться оценить только второе выражение, если первый имеет значение null.
ObjectUtils.firstNonNull(T...)
, от Apache Commons Lang 3 - еще один вариант. Я предпочитаю это, потому что в отличие от Гуавы, этот метод не генерирует Exception
. Он просто вернет null
;
Примитивы в Java никогда не могут быть нулевыми, поэтому оператор не имеет смысла концептуально. Однако классы-оболочки (Integer, Character и т.д.), А также любой другой экземплярный класс могут быть нулевыми.
Помимо этого факта, нет короткого синтаксиса для оператора нулевой коалесценции. Вы должны использовать расширенную форму.