2016-01-20 198 views
8

所以一些阅读后,我已经看到了的Java可选 - 如果else语句

if (optional.isPresent()) { 
    //do smth 
} 

是不使用可选(http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html)的首选方式。但是,如果我有一个if语句是这样的:

if (optional.isPresent()) { 
    car = getCar(optional.get()); 
} else { 
    car = new Car(); 
    car.setName(carName); 
} 

这是做到这一点的最好办法还是有一个比较推荐的方法是什么?

+0

我怀疑你甚至需要if语句,它有点违反整个观点。 – Stultuske

+0

@assylias这是如何工作的?可选的返回将是一个id而不是Car对象? – uraza

+0

其实它是包装器介绍给开发者,可以从一些方法返回值的缺席,他应该额外考虑。 – Antoniossss

回答

16

您可以使用Optional如下。

Car car = optional.map(id -> getCar(id)) 
      .orElseGet(() -> { 
       Car c = new Car(); 
       c.setName(carName); 
       return c; 
      }); 

if-else陈述文字是势在必行的风格,它需要的变量car之前if-else块声明。

Optional中使用map是更实用的风格。这种方法事先不需要变量声明,并且推荐使用Optional

+4

这确实似乎工作。但是,我想知道这是否使得代码更具可读性,或者是否有这种写法的优势。 – uraza

+0

这样写就会省略声明'Car car'变量的必要性。 – TheKojuEffect

+0

@uraza使用if-else是势在必行的风格,使用这种方法是功能风格。可读性以这种方式增加。 – TheKojuEffect

3

如果你可以将名称到Car构造函数,那么你可以这样写:

car = optional.map(id -> getCar(id)) 
       .orElseGet(() -> new Car(carName)); 

如果必须是分开的构造函数中调用的二传手,你最终会得到这样的:

car = optional.map(id -> getCar(id)) 
       .orElseGet(() -> { 
        Car c = new Car(); 
        c.setName(carName); 
        return c; 
       }); 
+1

如果Optional不为空,orElseGet是否真的返回一个Car对象? – uraza

+0

如果'Car'具有参数'carName'的构造函数,'car = optional.orElse(new Car(carName));'可以使用。 – TheKojuEffect

+0

看起来,'Op'使用'getCar'方法来获取'car',而不仅仅是'Optional'。 – TheKojuEffect