Получение первого не-null значения в Java: аналог SQL COALESCE

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для определения первого значения, отличного от null, вы можете использовать цепочку методов Stream.of(), filter(Objects::nonNull) и findFirst():

Java
Скопировать код
String firstNonNull = Stream.of(var1, var2, var3)
                            .filter(Objects::nonNull)
                            .findFirst()
                            .orElse(null);

Приведенный код возвращает первую переменную из var1, var2, var3, которая не равна null. Если все переменные null, то переменная firstNonNull также получит значение null.

Кинга Идем в IT: пошаговый план для смены профессии

Путь от простых к продвинутым решениям

Использование Apache Commons Lang

Библиотека Apache Commons Lang позволяет воспользоваться методом ObjectUtils.firstNonNull, который отличается удобством применения:

Java
Скопировать код
String firstNonNull = ObjectUtils.firstNonNull(var1, var2, var3);

Такой метод позволяет объединить значения, не делая явной проверки на null.

Минимализм с Guava

Метод MoreObjects.firstNonNull из Guava — это минималистичное решение:

Java
Скопировать код
String firstNonNull = MoreObjects.firstNonNull(var1, var2);

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

Применение перегруженных функций

Вы всегда можете создать свой собственной метод, аналогичный оператору SQL COALESCE, используя для этого перегрузку функций:

Java
Скопировать код
public static <T> T coalesce(T... values) {
    for (T val : values) {
        if (val != null) {
            return val;
        }
    }
    return null;
}

Такие методы легко подстраиваются под разные типы данных и улучшают читаемость вашего кода.

Визуализация

Markdown
Скопировать код
🏁 -> 🚧(null) -> 🚧(null) -> 🏆(non-null)

Процесс похож на забег: вы сталкиваетесь с препятствиями (🚧) и продолжаете движение до первого непустого значения (🏆)!

Java
Скопировать код
Objects.requireNonNullElse(firstValue, Objects.requireNonNullElse(secondValue, defaultValue));

Метод Objects.requireNonNullElse() позволяет "пропускать" null-значения до тех пор, пока не найдено первое значение, не равное null.

Другие методы

Изящество Optional

Применение Optional.ofNullable().orElse() удобно, когда мы работаем только с одной переменной:

Java
Скопировать код
String firstNonNull = Optional.ofNullable(var1).orElse(var2);

Этот способ краткого кода позволяет избежать излишней сложности.

Библиотека Jackson

В контексте обработки данных в формате JSON полезным окажется использование библиотеки Jackson и созданию пользовательского десериализатора:

Java
Скопировать код
public class NonNullDeserializer extends StdDeserializer<Object> {
   // Реализация пользовательской десериализации, склеивающей значения null
}

Учитывайте эффективность

При выборе решения важно учитывать частоту встречи null в данных. Если они встречаются редко, уместно использовать фильтрацию через Stream. При более частых случаях — рассмотрите вариант использования Apache Commons или создание пользовательских методов.

Полезные материалы

  1. Optional (Java Platform SE 8 ) — официальная документация Java 8 по классу Optional.
  2. Uses for Optional – Stack Overflow — обсуждение на Stack Overflow с примерами использования Optional в Java 8.
  3. Using Optional Correctly Is Not Optional – DZone — статья о тонкостях использования Optional с примерами лучших практик и его потенциальных подводных камней.
  4. Optional – The Mother of All Bikesheds by Stuart Marks – YouTube — видеоурок, детализированно разъясняющий работу с классом Optional.
  5. GitHub – reactor/reactor-core: Non-Blocking Reactive Foundation for the JVM — ресурс по реактивному программированию, облегчающему работу с null в Java.