0
点赞
收藏
分享

微信扫一扫

这段Java代码连不少大佬都栽了跟头,何况我

大师的学徒 2022-02-19 阅读 46


最近用了​​Optional​​实现了一段逻辑,想不到居然翻车了。看了源码之后才恍然大悟,不过翻车的不是我一个人,很多人都说自己在这个地方翻过车,其中不乏一些大佬级的人物。

接下来看看都是怎么翻车的吧。

String  conditional =  doPlanA();
if (conditional==null){
conditional = doPlanB();
}

这个代码片段相信大家都知道什么意思吧。​​doPlanA​​​的返回值如果为​​null​​​就执行​​doPlanB​​​来获取​​conditional​​的值。

如果好好按照规矩写就没什么问题,可我偏偏想用​​Optional​​重写这个逻辑,我想当然地以为是这么写的:

String  conditional = Optional.ofNullable(doPlanA())
.orElse(doPlanB());

当我执行了这段代码之后,怎么肥事?为什么当​​doPlanA​​​的返回值不为​​null​​​时​​doPlanB​​​也执行了?不过认真看了之后确实是自己误解了。因为这段代码其实执行的就是​​orElse​​​逻辑,而​​ofNullable​​​是定义初始化的逻辑,思维惯性把我带沟里了。执行​​orElse​​​逻辑必然执行​​doPlanB​​获取返回值传递给该方法的形参,因此出现了逻辑上的偏差。

那么如何才能真正的达到我们想要的效果呢?​​Optional​​​还提供了一个方法​​orElseGet​​:

public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}

传入的是一个​​Supplier​​函数,这个函数提供了一个获取结果的方法,只有当我们需要获取结果才会根据逻辑获取结果。所以最终的正确方式是这样的:

String  conditional = Optional.ofNullable(doPlanA())
.orElseGet(()->doPlanB());

从这个实例中我们可以发现,有时候的问题仅仅只是表象,会干扰我们的思维。很多时候我们需要突破惯性思维,对API的理解再深入些,这样才能少犯错。不知道你有没有犯过类似的错误,欢迎留言讨论。





举报

相关推荐

0 条评论