最近在学习java的Optional,介绍中感觉Optional好强大,我根据教程写了案列,但是结果是我没有想到的。代码如下
@Data
public class PersonT {
private Optional car;
}
@Data
public class CarT {
private String name;
private Optional insurance;
}
@Data
public class InsuranceT {
private String name;
}
public static void main(String[] args) {
String name = Optional.of(new PersonT()).flatMap(PersonT::getCar)
.flatMap(CarT::getInsurance)
.map(InsuranceT::getName)
.orElse("Unknown");
System.out.println(name);
}
我发现执行了这段代码后并没有达到我的预想结果,我以为会返回”Unknown”,但是给我抛出了空指针异常,我想知道这是什么原因
问题补充……………………
其实看了教程写着上边的这种写法可以替换我下边的这种写法
if(personT != null) {
CarT carT = personT.getCar();
if(carT != null) {
InsuranceT insuranceT = carT.getInsurance();
if(insuranceT != null) {
return insuranceT.getName();
} else {
return "Unknown";
}
} else {
return "Unknown";
}
} else {
return "Unknown";
}
回答
要实现你的效果应该是这样的
class PersonT {
private CarT car;
public Optional getCar() {
return Optional.ofNullable(car);
}
public void setCar(CarT car) {
this.car = car;
}
}
class CarT {
private String name;
private InsuranceT insurance;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Optional getInsurance() {
return Optional.ofNullable(insurance);
}
public void setInsurance(InsuranceT insurance) {
this.insurance = insurance;
}
}
class InsuranceT {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}
public class demo {
public static void main(String[] args) {
String name = Optional.ofNullable(new PersonT()).flatMap(PersonT::getCar)
.flatMap(CarT::getInsurance)
.map(InsuranceT::getName)
.orElse("Unknown");
System.out.println(name);
}
}