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