Получение первого не-null значения в Java: аналог SQL COALESCE
Быстрый ответ
Для определения первого значения, отличного от null, вы можете использовать цепочку методов Stream.of(), filter(Objects::nonNull) и findFirst():
String firstNonNull = Stream.of(var1, var2, var3)
.filter(Objects::nonNull)
.findFirst()
.orElse(null);
Приведенный код возвращает первую переменную из var1, var2, var3, которая не равна null. Если все переменные null, то переменная firstNonNull также получит значение null.

Путь от простых к продвинутым решениям
Использование Apache Commons Lang
Библиотека Apache Commons Lang позволяет воспользоваться методом ObjectUtils.firstNonNull, который отличается удобством применения:
String firstNonNull = ObjectUtils.firstNonNull(var1, var2, var3);
Такой метод позволяет объединить значения, не делая явной проверки на null.
Минимализм с Guava
Метод MoreObjects.firstNonNull из Guava — это минималистичное решение:
String firstNonNull = MoreObjects.firstNonNull(var1, var2);
Воспользуйтесь этим компактным методом, если ваш проект уже использует функциональность Guava.
Применение перегруженных функций
Вы всегда можете создать свой собственной метод, аналогичный оператору SQL COALESCE, используя для этого перегрузку функций:
public static <T> T coalesce(T... values) {
for (T val : values) {
if (val != null) {
return val;
}
}
return null;
}
Такие методы легко подстраиваются под разные типы данных и улучшают читаемость вашего кода.
Визуализация
🏁 -> 🚧(null) -> 🚧(null) -> 🏆(non-null)
Процесс похож на забег: вы сталкиваетесь с препятствиями (🚧) и продолжаете движение до первого непустого значения (🏆)!
Objects.requireNonNullElse(firstValue, Objects.requireNonNullElse(secondValue, defaultValue));
Метод Objects.requireNonNullElse() позволяет "пропускать" null-значения до тех пор, пока не найдено первое значение, не равное null.
Другие методы
Изящество Optional
Применение Optional.ofNullable().orElse() удобно, когда мы работаем только с одной переменной:
String firstNonNull = Optional.ofNullable(var1).orElse(var2);
Этот способ краткого кода позволяет избежать излишней сложности.
Библиотека Jackson
В контексте обработки данных в формате JSON полезным окажется использование библиотеки Jackson и созданию пользовательского десериализатора:
public class NonNullDeserializer extends StdDeserializer<Object> {
// Реализация пользовательской десериализации, склеивающей значения null
}
Учитывайте эффективность
При выборе решения важно учитывать частоту встречи null в данных. Если они встречаются редко, уместно использовать фильтрацию через Stream. При более частых случаях — рассмотрите вариант использования Apache Commons или создание пользовательских методов.
Полезные материалы
- Optional (Java Platform SE 8 ) — официальная документация Java 8 по классу Optional.
- Uses for Optional – Stack Overflow — обсуждение на Stack Overflow с примерами использования Optional в Java 8.
- Using Optional Correctly Is Not Optional – DZone — статья о тонкостях использования Optional с примерами лучших практик и его потенциальных подводных камней.
- Optional – The Mother of All Bikesheds by Stuart Marks – YouTube — видеоурок, детализированно разъясняющий работу с классом Optional.
- GitHub – reactor/reactor-core: Non-Blocking Reactive Foundation for the JVM — ресурс по реактивному программированию, облегчающему работу с
nullв Java.


