Подтвердить что ты не робот

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

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

Здесь, в stackoverflow, я ничего не нашел об этом. Я ищу только чистое решение Guava (если есть)!

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

4b9b3361

Ответ 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

Ответ 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()