如何使用Guava将可能的空值转换为默认值?

时间:2011-11-07 16:33:31

标签: java guava

如果传递的对象引用是null,Guava是否提供了获取默认值的方法?如果 obj 是{{strong> obj ,那么我会查找<T> T nullToDefault(T obj, T default)之类的内容 默认 {1}}。

这里有关于stackoverflow我一无所获。我只是在寻找纯粹的番石榴解决方案(如果有的话)!

我在Gauva 10 API中没有发现任何内容,只有null看起来很有希望但缺少类似的内容。

10 个答案:

答案 0 :(得分:71)

除了Objects.firstNonNull之外,Guava 10.0还添加了Optional类作为此类问题的更通用的解决方案。

Optional可能包含或不包含值。有多种方法可以创建Optional实例,但对于您的情况,工厂方法Optional.fromNullable(T)是合适的。

获得Optional后,您可以使用其中一种or方法获取Optional包含的值(如果包含值)或其他值(如果有)没有)。

总而言之,您的简单示例如下:

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

如果您想使用Optional作为默认值(因此除非必要,您不进行计算以获取它)或者如果您想链接,Supplier的额外灵活性就会出现多个可选值一起获取存在的第一个值,例如:

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

答案 1 :(得分:57)

怎么样

MoreObjects.firstNonNull(obj, default)

请参阅JavaDoc

(历史记录:MoreObjects类曾被称为Objects,但它已重命名,以避免与Java 7中引入的java.util.Objects类混淆。番石榴{{1} } class现在已被有效弃用。)

答案 2 :(得分:37)

如前所述,番石榴解决方案是正确的。

Java 8 纯JDK 解决方案:

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

请参阅java.util.Optional

的文档

答案 3 :(得分:9)

这应该可以解决问题:Objects.firstNonNull(o, default)
guava API doc

答案 4 :(得分:8)

如果您的对象不是可选项,则Optional / firstNotNull建议会使简单的Java功能(三元运算符)变得复杂:

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

包含依赖项和多个方法调用会引入与三元运算符一样多的读取复杂性。我甚至认为使用Optional与其相反的方法可能会或者可能不会返回一个对象&#39;语义是一个红旗,你做错了(正如在其他情况下,一个人滥用与该事物的语义有关的东西)。

有关三元运算符的更多讨论,请参阅http://alvinalexander.com/java/edu/pj/pj010018

答案 5 :(得分:6)

如果你只是在谈论字符串,那么还有Apache Commons defaultString和defaultIfEmpty方法

defaultString只会给你一个真正的null的默认值,而defaultIfEmpty会给你一个null或空字符串的默认值。

还有defaultIfBlank即使在空白字符串上也会提供默认值。

e.g。

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

描述现在将等于“Theodore”

编辑: Apache Commons还有一个ObjectUtils类,它为完全烘焙的对象执行null默认值...

答案 6 :(得分:4)

仅供参考,Java 9有两种方法可以完全满足您的需求:

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

懒惰的版本:

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

答案 7 :(得分:3)

java.util.Objects和Guava的可选提供了很好的方法来覆盖null到默认值...已经使用了很多

但是这里有一些更为迫切的想法:

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

答案 8 :(得分:1)

考虑使用内置于Guava 10中的Optional。您可以将多个选项串起来,例如Optional.fromNullable(var).orNull()Optional.fromNullable(var).or(Optional.of(var2)).orNull()

答案 9 :(得分:0)

您可以使用ObjectUtils.defaultIfNull()库中的org.apache.commons.lang3

public static <T> T defaultIfNull(T object, T defaultValue)