Получение первого не-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.

Пошаговый план для смены профессии

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

Использование 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.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как получить первое значение, отличное от null, в Java?
1 / 5