【问题标题】:Optional way of if / else [duplicate]if / else的可选方式[重复]
【发布时间】:2019-12-06 18:32:21
【问题描述】:

我试图通过使用 Java Optional 来避免传统的 if / else 块。 但是我仍然缺少对如何实现下一个要求的理解:

    if (x != null)
       foo1();
    else
       foo2();

public void foo1(){
   print("X not null");
}

public void foo2(){
   print("X is null");
}

谢谢

【问题讨论】:

    标签: java optional


    【解决方案1】:

    我正在尝试避免传统的if / else

    这就是问题所在。没有理由重写您提供给Optional 的sn-p。你不会以任何方式从中受益。

    if-else 是一个控制流语句,而Optional 是一个实用程序that indicates the absence of a return value,有一堆类似函数的方法可以很好地处理它。

    如果您正在寻找捷径或更精确的表达方式,请使用三元运算符。

    print(x != null ? "X not null" : "X is null");
    

    否则,保持原样。你总能找到更有趣的东西来玩。

    【讨论】:

    • 您能否解释一下如何避免传统的if/else 是问题所在? “没有理由这样做”这一事实并不一定会成为问题...此外,有趣的是,建议使用条件运算符作为摆脱@987654328 的更好选择@块。
    • 但请注意 void 函数(可能想要调用它),你不能(至少我不能,也许你有一个想法,我被卡住了)让三元运算符来做这个把戏除非你将它们转换为返回无意义值的东西,比如 true 的布尔值,然后你会忽略它。
    • @ernest_k 就个人而言,考虑将一个无害的if-else 重写为一个没有道理的Optional 是个问题......
    • @JeremyKahan 这些方法可能会返回String,这将是要打印的值:它不会是 that 毫无意义的......不过,这个例子看起来很肤浅。所以没什么好说的……
    • @AndrewTobilko 是的,这是一个很好的观点。这与我一直在阅读的关于输出是副作用的设计原则是一致的,并且您不希望您的较低级别的函数具有它们。
    【解决方案2】:

    来自jdk-9,您可以使用ifPresentOrElse

    public void ifPresentOrElse​(Consumer<? super T> action,
                            Runnable emptyAction)
    

    代码

    Optional.ofNullable(x).ifPresentOrElse(x->foo1(), ()->foo2());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-08
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 2021-11-25
      • 2021-01-21
      相关资源
      最近更新 更多