java null 赋值_java-检查返回的值是否不为null,如果这样,则用一种方法在一行中将其赋值...

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值