所以经过一些阅读后我才看到
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);
}
这是最好的方法吗?还是有更推荐的方式?
答案 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();