java-检查返回的值是否不为null,如果这样,则用一种方法在一行中将其赋值
Java充斥着诸如以下语句:
if(cage.getChicken() != null) {
dinner = cage.getChicken();
} else {
dinner = getFreeRangeChicken();
}
在将返回的对象分配给dinner之前,它需要两次调用getChicken()。
也可以这样写成一行:
dinner = cage.getChicken() != null? cage.getChicken() : getFreeRangeChicken();
但可惜仍然有两个电话getChicken()。
当然,我们可以分配一个局部变量,然后如果它不为null,则再次使用三元运算符对其进行分配,但这是两行,并不是那么漂亮:
FutureMeal chicken = cage.getChicken();
dinner = chicken != null? chicken : getFreeRangeChicken();
所以有什么办法可以说:
变量var =如果某个值不为null或其他一些值 值;
而且我想我只是在这里说语法,在编译代码之后,从性能的角度来看,编写代码的方式可能并没有多大区别。
由于这是常见的代码,因此最好编写一个代码行。
其他语言是否具有此功能?
9个解决方案
58 votes
与Loki的回答原理相同,但更短。 请记住,较短并不意味着更好。
dinner = Optional.ofNullable(cage.getChicken())
.orElse(getFreerangeChicken());
注意:JDK的架构师和Optional功能的设计师明确建议不要使用Optional。 您正在分配一个新对象,并立即将其丢弃。 但另一方面,它可能是很可读的。
jhyot answered 2020-06-22T01:30:46Z
51 votes
Java缺少合并运算符,因此,对于带有单个调用的赋值,带有显式临时代码的最佳选择。
您可以将结果变量用作临时变量,如下所示:
dinner = ((dinner = cage.getChicken()) != null) ? dinner : getFreeRangeChicken();
但是,这很难阅读。
dasblinkenlight answered 2020-06-22T01:30:21Z
12 votes
如果您尚未使用Java 1.8,并且不介意使用commons-lang,则可以使用org.apache.commons.lang3.ObjectUtils#defaultIfNull
您的代码为:
dinner = ObjectUtils.defaultIfNull(cage.getChicken(),getFreeRangeChicken())
Pieter De Bie answered 2020-06-22T01:31:10Z
11 votes
使用Java 1.8可以使用getChicken()
public class Main {
public static void main(String[] args) {
//example call, the methods are just dumb templates, note they are static
FutureMeal meal = getChicken().orElse(getFreeRangeChicken());
//another possible way to call this having static methods is
FutureMeal meal = getChicken().orElseGet(Main::getFreeRangeChicken); //method reference
//or if you would use a Instance of Main and call getChicken and getFreeRangeChicken
// as nonstatic methods (assume static would be replaced with public for this)
Main m = new Main();
FutureMeal meal = m.getChicken().orElseGet(m::getFreeRangeChicken); //method reference
//or
FutureMeal meal = m.getChicken().orElse(m.getFreeRangeChicken()); //method call
}
static Optional getChicken(){
//instead of returning null, you would return Optional.empty()
//here I just return it to demonstrate
return Optional.empty();
//if you would return a valid object the following comment would be the code
//FutureMeal ret = new FutureMeal(); //your return object
//return Optional.of(ret);
}
static FutureMeal getFreeRangeChicken(){
return new FutureMeal();
}
}
您将为getChicken()实现逻辑,以返回Optional.empty()(而不是null)或orElse(fallback),其中myReturnObject是您的chicken。
然后,您可以调用getChicken(),如果返回Optional.empty(),则orElse(fallback)会给您带来任何后退,这是您的第二种方法。
Loki answered 2020-06-22T01:31:40Z
4 votes
从Java 9开始,您可以使用Objects#requireNonNullElse来执行以下操作:
public static T requireNonNullElse(T obj, T defaultObj) {
return (obj != null) ? obj : requireNonNull(defaultObj, "defaultObj");
}
您的代码将是
dinner = Objects.requireNonNullElse(cage.getChicken(), getFreeRangeChicken());
这是1行,仅调用一次null,因此两个要求都得到满足。
请注意,第二个参数也不能为null; 此方法强制返回值不为空。
还考虑其他Objects#requireNonNullElseGet:
public static T requireNonNullElseGet(T obj, Supplier extends T> supplier)
如果第一个参数不是null,则该参数甚至不会求值第二个参数,但确实会产生创建Supplier的开销。
user1803551 answered 2020-06-22T01:32:22Z
2 votes
用你自己的
public static T defaultWhenNull(@Nullable T object, @NonNull T def) {
return (object == null) ? def : object;
}
例:
defaultWhenNull(getNullableString(), "");
优点
如果您不使用Java8开发,则可以使用
适用于android开发并支持pre API 24设备
不需要外部库
缺点
始终评估Optional.orElse()(而不是cond ? nonNull() : notEvaluated())
可以通过传递Callable而不是默认值来避免这种情况,但是会使其变得更加复杂且动态性较低(例如,如果性能成为问题)。
顺便说一句,当使用Optional.orElse() ;-)时,您会遇到相同的缺点。
Levit answered 2020-06-22T01:33:21Z
0 votes
dinner = cage.getChicken();
if(dinner == null) dinner = getFreeRangeChicken();
要么
if( (dinner = cage.getChicken() ) == null) dinner = getFreeRangeChicken();
crashxxl answered 2020-06-22T01:33:41Z
0 votes
另外,在Java8中,您可以根据需要使用Nullable或NotNull注释。
public class TestingNullable {
@Nullable
public Color nullableMethod(){
//some code here
return color;
}
public void usingNullableMethod(){
// some code
Color color = nullableMethod();
// Introducing assurance of not-null resolves the problem
if (color != null) {
color.toString();
}
}
}
public class TestingNullable {
public void foo(@NotNull Object param){
//some code here
}
...
public void callingNotNullMethod() {
//some code here
// the parameter value according to the explicit contract
// cannot be null
foo(null);
}
}
[HTTP://mind pro的.com/就gloss/at null able.HTML]
shan answered 2020-06-22T01:34:05Z
0 votes
这个怎么样?
dinner = cage.getChicken();
if(dinner == null) {
dinner = getFreeRangeChicken();
}
这种方法删除了else部分。
Lokesh Agrawal answered 2020-06-22T01:34:29Z