Как преобразовать возможное значение null в значение по умолчанию с помощью Guava?
Предоставляет ли Guava метод получения значения по умолчанию, если ссылка на переданный объект null
? Я искал что-то вроде <T> T nullToDefault(T obj, T default)
, были возвращены по умолчанию, если obj null
.
Здесь, в stackoverflow, я ничего не нашел об этом. Я ищу только чистое решение Guava (если есть)!
Я ничего не нашел в API Gauva 10, только com.google.common.base.Objects
выглядит многообещающим, но ему не хватает чего-то подобного.
Ответы
Ответ 1
В дополнение к Objects.firstNonNull
, Guava 10.0 добавил класс Optional как более общее решение для этого типа проблем.
An Optional
- это то, что может содержать или не содержать значение. Существуют различные способы создания экземпляра Optional
, но для вашего случая подходит метод factory Optional.fromNullable(T)
.
После того, как у вас есть Optional
, вы можете использовать один из методов or
, чтобы получить значение, которое содержит Optional
(если оно содержит значение) или какое-то другое значение (если это не так).
Объединяя все это, ваш простой пример будет выглядеть так:
T value = Optional.fromNullable(obj).or(defaultValue);
Добавлена дополнительная гибкость Optional
, если вы хотите использовать Supplier
для значения по умолчанию (чтобы вы не делали вычисления, чтобы получить его, если это необходимо) или если вы хотите связать несколько необязательных значений вместе чтобы получить первое значение, которое присутствует, например:
T value = someOptional.or(someOtherOptional).or(someDefault);
Ответ 2
Как насчет
MoreObjects.firstNonNull(obj, default)
Смотрите JavaDoc.
(Историческое примечание: класс MoreObjects
назывался Objects
, но его переименовали, чтобы избежать путаницы с java.util.Objects
, введенный в Java 7. Класс Guava Objects
теперь эффективно устарел.)
Ответ 3
Как было сказано ранее, решение Guava правильное.
Однако существует чистое JDK решение с Java 8:
Optional.ofNullable( var ).orElse( defaultValue );
См. документацию java.util.Optional
Ответ 4
Это должно сделать трюк: Objects.firstNonNull(o, default)
См. API-интерфейс guava API
Ответ 5
Если ваш объект еще не является необязательным, то опции Optional/firstNotNull усложняют то, что является простой функцией Java, тройной оператор:
T myVal = (val != null) ? val : defaultVal;
Включение вызовов зависимостей и нескольких методов представляет собой большую сложность чтения, чем тернарный оператор. Я бы даже утверждал, что использование Optional
вопреки его "моему методу может или не может возвращать объект" семантика - это красный флаг, что вы делаете что-то не так (как в других случаях, когда кто-то злоупотребляет чем-то, что противоречит этой вещи, значение).
Подробнее о тернарном операторе см. http://alvinalexander.com/java/edu/pj/pj010018.
Ответ 6
Если вы говорите только о Строках, есть также Apache Commons defaultString и методы defaultIfEmpty
defaultString предоставит вам значение по умолчанию только для истинного нуля, тогда как defaultIfEmpty предоставит вам значение по умолчанию для пустой или пустой строки.
Существует также defaultIfBlank, который даст вам значение по умолчанию даже в пустой строке.
например.
String description = "";
description = StringUtils.defaultIfBlank(description, "Theodore");
теперь будет равно "Теодор"
Изменить:
Apache Commons также имеет класс ObjectUtils, который выполняет нулевые значения по умолчанию для полностью испеченных объектов...
Ответ 7
Просто FYI, Java 9 имеет два метода, которые делают именно то, что вы хотите:
public static <T> T requireNonNullElse(T obj, T defaultObj);
И ленивая версия:
public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier)
Ответ 8
java.util.Objects и Guava необязательно предоставляют хороший способ для получения переопределения значений по умолчанию по умолчанию... много используют их
Но вот что-то для более настоятельного:
public static <T> T firstNotNuLL(T...args){
for (T arg : args)
if ( arg != null) return arg;
throw new NullPointerException();
}
Ответ 9
Рассмотрим использование Optional
, встроенного в Guava 10. Вы можете объединить несколько дополнительных элементов, например Optional.fromNullable(var).orNull()
или Optional.fromNullable(var).or(Optional.of(var2)).orNull()
Ответ 10
Вы можете использовать ObjectUtils.defaultIfNull()
из библиотеки org.apache.commons.lang3 вместо Guava:
public static <T> T defaultIfNull(T object, T defaultValue)