Java 8可选而不是if

Mat*_*zak 5 java if-statement optional java-8

我有Optional的问题,我不知道如何处理它.

public void check(String name) {
   if (name != null)
      doSomething(name);
   else 
      doMore();
} 
Run Code Online (Sandbox Code Playgroud)

如果进入Optional,如何更改?

Eug*_*ene 13

有一个非常巧妙的方法,但在jdk-9 ...

public void check(String name){
     Optional.ofNullable(name)
            .ifPresentOrElse(YourClass::doSomething, YourClass::doMore);
} 
Run Code Online (Sandbox Code Playgroud)

假设doSomething并且doMore是静态方法...如果不是应该使用实例,例如this::doSomethingthis::doMore

  • 我会说这离*整洁*很远.该代码比原始代码更长,更模糊.虽然技术上正确,但我会要求在代码审查中看到它时进行更改. (10认同)

luk*_*302 7

虽然有一种方法可以使用Optionals 创建相同的代码(例如,请参阅Eugene的答案),但您不应该Optional在这里使用s(imho).

要么你将Optional传递给你的方法,这会给调用者带来开销,并且没有真正理解为什么/为什么用例Optional被引入.
或者你会Optional在方法中创建自己.这更"好"但非常麻烦,模糊了实际发生的事情,如果我在代码审查期间遇到它,我会要求更改它.只需使用a Optional和您当前的代码比较代码段- 您的代码可能在字符方面更短,很明显发生了什么.在这里使用Optionals的唯一好处是,它似乎变成了一个单行,首先没有什么比可读性更重要,而且如果你想添加一些大括号,它是你无论如何都可以实现的.


底线:您的代码完全没问题.

  • 这值得商de ...没有有效的技术论据来拒绝@Eugene的代码,即在评论中。只是口味问题,两种方法都可以。*您*说功能的方法可读性较差,但这可能完全是因为*您*习惯于命令式构造,对您而言看起来很怪异或缺乏表现力。两种方法都是正确且清晰的,*一旦您习惯了功能构造*。另一方面,没有理由用某种清晰易读的功能等效结构代替清晰易读的命令式结构。 (2认同)
  • 我在代码审查期间发现了这样的代码,并且我要求将其完全按照您编写的方式进行更改。很高兴知道并非所有 Java 程序员都将 java.util.Optional 放在理论上可能的地方! (2认同)

alb*_*nil 5

没有理由改变你的实现。在java 8中,没有办法在没有if的情况下使用Optional做你想做的事,同时尊重不使用“map”产生副作用的想法。

我的意思是,你可以有

public void check(String name) {
    Optional<String> nameOpt = Optional.ofNullable(name);
    nameOpt.ifPresent(n -> doSomething(n));
    if (!nameOpt.isPresent()) {
        doMore();
    }
}
Run Code Online (Sandbox Code Playgroud)

但这没有意义。这里有一篇很好的文章,Optional 试图解决什么问题(以及它的用途):主要针对返回类型。其他东西只是过度使用它。