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

Chr*_*iss 54 java guava

如果传递的对象引用是,那么Guava是否提供了获取默认值的方法null?我正在寻找类似的东西<T> T nullToDefault(T obj, T default),如果obj是,则返回默认值.null

在stackoverflow上,我一无所获.我只是在寻找纯粹的番石榴解决方案(如果有的话)!

我在Gauva 10 API中找不到任何东西,只com.google.common.base.Objects看起来很有希望,但缺少类似的东西.

Col*_*inD 72

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

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

一旦有了Optional,就可以使用其中一种or方法来获取Optional包含的值(如果它包含一个值)或一些其他值(如果没有).

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

T value = Optional.fromNullable(obj).or(defaultValue);
Run Code Online (Sandbox Code Playgroud)

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

T value = someOptional.or(someOtherOptional).or(someDefault);
Run Code Online (Sandbox Code Playgroud)


Sim*_*son 57

怎么样

MoreObjects.firstNonNull(obj, default)
Run Code Online (Sandbox Code Playgroud)

请参阅JavaDoc.

(历史记录:这个MoreObjects类曾经被调用Objects,但它被重命名以避免与java.util.ObjectsJava 7中引入的类混淆Objects.现在已经有效地弃用了Guava 类.)


Nic*_*lis 38

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

然而,Java 8有一个纯JDK解决方案:

Optional.ofNullable( var ).orElse( defaultValue );
Run Code Online (Sandbox Code Playgroud)

参见文档 java.util.Optional


Jen*_*ann 9

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


Mon*_*rts 8

如果您的对象不是Optional,那么Optional/firstNotNull建议会使简单的Java特性(三元运算符)变得复杂:

T myVal = (val != null) ? val : defaultVal;
Run Code Online (Sandbox Code Playgroud)

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

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


Dan*_*idt 7

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

defaultString只会为true提供默认值,而defaultIfEmpty将为null或空字符串提供默认值.

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

例如

String description = "";
description = StringUtils.defaultIfBlank(description, "Theodore"); 
Run Code Online (Sandbox Code Playgroud)

描述现在将等于"西奥多"

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


Zhe*_*lov 6

仅供参考,Java 9有两种完全可以实现您想要的方法:

public static <T> T requireNonNullElse(T obj, T defaultObj);
Run Code Online (Sandbox Code Playgroud)

和一个懒惰的版本:

public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier)
Run Code Online (Sandbox Code Playgroud)