Как преобразовать возможное нулевое значение в значение по умолчанию с помощью Guava?


предоставляет ли Guava метод для получения значения по умолчанию, если переданная ссылка на объект null ? Я ищу что-то вроде <T> T nullToDefault(T obj, T default), были по умолчанию возвращается, если obj и null.

здесь на stackoverflow я ничего не нашел. Я только ищу чистое решение гуавы (если оно есть)!

Я ничего не нашел в GAUVA 10 API, только com.google.common.base.Objects выглядит многообещающе, но чего-то не хватает подобный.

9 51

9 ответов:

в дополнение к Objects.firstNonNull, Guava 10.0 добавил дополнительно класс как более общее решение этой проблемы.

An Optional - это то, что может или не может содержать значение. Существуют различные способы создания Optional экземпляр, но для вашего случая метод фабрики Optional.fromNullable(T) уместно.

после Optional, вы можете использовать or методы для получения значения Optional содержит (если содержит значение) или некоторые другое значение (если это не так).

складывая все это вместе, ваш простой пример будет выглядеть так:

T value = Optional.fromNullable(obj).or(defaultValue);

дополнительная гибкость Optional входит, если вы хотите использовать Supplier для значения по умолчанию (поэтому вы не выполняете вычисление, чтобы получить его, если это необходимо) или если вы хотите объединить несколько необязательных значений вместе, чтобы получить первое значение, которое присутствует, например:

T value = someOptional.or(someOtherOptional).or(someDefault);

как о

MoreObjects.firstNonNull(obj, default)

посмотреть документация.

(историческая справка:

Как было сказано ранее, решение гуава является правильным.

однако чистый JDK решение Java 8:

Optional.ofNullable( var ).orElse( defaultValue );

см. документацию java.util.Optional

Это должно сделать трюк:Objects.firstNonNull(o, default)
Смотрите guava API doc

Если ваш объект еще не является необязательным, то необязательные/firstNotNull предложения усложняют то, что является простой функцией Java, тернарный оператор:

T myVal = (val != null) ? val : defaultVal;

включение зависимостей и вызовов нескольких методов приводит к такой же сложности чтения, как и тернарный оператор. Я бы даже сказал, что с помощью Optional в отличие от его семантики "мой метод может или не может возвращать объект" является красным флагом, что вы делаете что-то неправильно (так же, как и в других случаях, когда один злоупотребляет чем-то, что противоречит семантическому значению этой вещи).

см.http://alvinalexander.com/java/edu/pj/pj010018 для более подробного обсуждения тернарного оператора.

Если вы говорите только о строках, есть также Apache Commons defaultString и defaultIfEmpty методы

defaultString только даст вам по умолчанию на истинный нуль, в то время как метода defaultifempty даст вам по умолчанию значение null или пустую строку.

существует также defaultIfBlank, который даст вам значение по умолчанию даже на пустой строке.

например

String description = "";
description = StringUtils.defaultIfBlank(description, "Theodore"); 

описание теперь будет равно "Теодор"

изменить: Апаш Commons также имеет класс ObjectUtils, который делает значения по умолчанию null для полностью испеченных объектов...

java.утиль.Объекты и необязательные Guava предоставляют хороший способ для получения переопределения null для значений по умолчанию... использовал их много

но вот что-то более важно единомышленников :

public static <T> T firstNotNuLL(T...args){
    for (T arg : args)
        if ( arg != null) return arg;
    throw new NullPointerException();  
}

просто FYI, Java 9 имеет два метода, которые делают именно то, что вы хотите:

public static <T> T requireNonNullElse(T obj, T defaultObj);

и ленивая версия:

public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier)

рассмотрите возможность использования Optional встроенный в гуава 10. Вы можете объединить несколько вариантов, например Optional.fromNullable(var).orNull() или Optional.fromNullable(var).or(Optional.of(var2)).orNull()