Java可选 - 如果是其他语句

时间:2016-01-20 14:05:17

标签: java if-statement java-8 optional

所以经过一些阅读后我才看到

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

不是使用Optional(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);
}

这是最好的方法吗?还是有更推荐的方式?

3 个答案:

答案 0 :(得分:26)

您可以使用以下Optional

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

使用if-else语句编写是必要的样式,它要求在car块之前声明变量if-else

map中使用Optional功能更强大。而且这种方法不需要事先进行变量声明,建议使用Optional

答案 1 :(得分:5)

如果您可以将名称合并到Car构造函数中,那么您可以写下:

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

如果你必须从构造函数中单独调用setter,你最终会得到这样的结果:

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

答案 2 :(得分:0)

如果有多个if (optional.isPresent())if (obj != null)

,请进一步讲解

您可以这样做:

(getN返回Optional<Car>

return get1().map(Optional::of)
.orElseGet(() -> get2()).map(Optional::of)
.orElseGet(() -> get3()).map(Optional::of);

即使用if语句是这样的

Optional<Car> car = get1();
if (car.isPresent()){
  return car;
}
car = get2();
if (car.isPresent()){
  return car;
}
car = get3();
if (car.isPresent()){
  return car;
}
return Optional.empty();