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

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

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

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

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

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

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

当我执行了这段代码之后,怎么肥事?为什么当doPlanA的返回值不为nulldoPlanB也执行了?不过认真看了之后确实是自己误解了。因为这段代码其实执行的就是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的理解再深入些,这样才能少犯错。不知道你有没有犯过类似的错误,欢迎留言讨论。

打个赌你可能不知道如何获取Java泛型的Class对象

2021-07-01

后端Java开发如何防御XSS攻击

2021-06-30

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小胖哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值