如何使用番石榴将可能的空值转换为默认值?
如果传递的对象引用为null
Guava是否提供了获取默认值的方法? 我正在寻找类似于<T> T nullToDefault(T obj, T default)
,如果obj为null
则返回默认 null
。
这里在stackoverflow我没有发现任何关于它。 我只是寻找一个纯粹的番石榴解决scheme(如果有的话)!
我在Gauva 10 API中找不到任何东西,只有com.google.common.base.Objects
看起来很有前途,但是缺less类似的东西。
除了Objects.firstNonNull
,Guava 10.0添加了Optional类作为这种types的问题的更一般的解决scheme。
一个Optional
的东西,可能会或可能不包含一个值。 创buildOptional
实例的方法有很多种,但是对于您的情况,可以使用Factory方法Optional.fromNullable(T)
。
一旦你有一个Optional
,你可以使用其中一个or
方法来获取Optional
包含的值(如果它包含一个值)或其他值(如果没有)。
把它放在一起,你的简单例子看起来像:
T value = Optional.fromNullable(obj).or(defaultValue);
如果你想使用一个Supplier
的默认值(所以你不做计算,以获得它,除非必要),或者如果你想要链接多个可选值,以获得第一个值是Optional
的额外的灵活性目前,例如:
T value = someOptional.or(someOtherOptional).or(someDefault);
怎么样
MoreObjects.firstNonNull(obj, default)
请参阅JavaDoc 。
(历史logging: MoreObjects
类曾经被称为Objects
,但它被重命名以避免与Java 7 java.util.Objects
引入的java.util.Objects
类混淆。现在,Guava Objects
类已被弃用。
如前所述,番石榴解决scheme是正确的。
然而,有一个纯 Java的 JDK解决scheme:
Optional.ofNullable( var ).orElse( defaultValue );
请参阅java.util.Optional
文档
这应该做的伎俩: Objects.firstNonNull(o, default)
请参阅番石榴API文档
如果你的对象还不是一个可选的,那么可选/ firstNotNullbuild议使一个简单的Java特性,三元运算符变得复杂:
T myVal = (val != null) ? val : defaultVal;
包括一个依赖和多个方法调用引入与三元运算符一样多的读取复杂性。 我甚至会争辩说,使用Optional
违背它的'我的方法可能会或可能不会返回一个对象'的语义是一个红旗,你做错了什么(正如在其他情况下,滥用与事物的语义意义相反的东西) 。
有关三元运算符的更多讨论,请参见http://alvinalexander.com/java/edu/pj/pj010018 。
如果你只是在谈论string,还有Apache Commons的defaultString和defaultIfEmpty方法
defaultString只会给你一个true null的默认值,而defaultIfEmpty会给你一个null或一个空string的默认值。
也有defaultIfBlank,即使在一个空白的string,它也会给你默认的。
例如
String description = ""; description = StringUtils.defaultIfBlank(description, "Theodore");
现在描述将等于“Theodore”
编辑:Apache Commons也有一个ObjectUtils类,对于完全烘焙的对象,默认值为null …
java.util.Objects和Guava的可选做提供了很好的方法来获取覆盖空值为默认值…一直使用它们
但是,这里有更重要的意见:
public static <T> T firstNotNuLL(T...args){ for (T arg : args) if ( arg != null) return arg; throw new NullPointerException(); }
可以使用Guava 10中内置的可Optional
。可以将多个可Optional.fromNullable(var).orNull()
如Optional.fromNullable(var).orNull()
或Optional.fromNullable(var).or(Optional.of(var2)).orNull()
只是FYI,Java 9有两种方法可以完成你想要的function:
public static <T> T requireNonNullElse(T obj, T defaultObj);
而一个懒惰的版本:
public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier)