我有以下类定义。
保险.java
package Chapter10;
public class Insurance {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
汽车.java
package Chapter10;
import java.util.Optional;
public class Car {
private Optional<Insurance> insurance;
public Optional<Insurance> getInsurance() {
return insurance;
}
public void setInsurance(Optional<Insurance> insurance) {
this.insurance = insurance;
}
}
Person.java
package Chapter10;
import java.util.Optional;
public class Person {
private Optional<Car> car;
public Optional<Car> getCar() {
return car;
}
public void setCar(Optional<Car> car) {
this.car = car;
}
}
现在,我有以下主类,但我收到 NullPoinerException 对于人页。
package Chapter10;
import java.util.Optional;
public class OptionalTester {
public static String getCarInsuranceName(Optional<Person> person) {
return person.flatMap(Person::getCar)
.flatMap(Car::getInsurance)
.map(Insurance::getName)
.orElse("Unknown");
}
public static void main(String[] args) {
Insurance iffco = new Insurance();
iffco.setName("IFFCO TOKIO");
Insurance argo = new Insurance();
argo.setName("HDFC ARGO");
Car i10 = new Car();
i10.setInsurance(Optional.of(iffco));
Car santro = new Car();
Person p = new Person();
p.setCar(Optional.of(santro));
Person p1 = new Person();
p1.setCar(Optional.of(i10));
System.out.println("---------------FROM PERSON GET INSURANCE----------------------");
Optional<Insurance> optInsurance = Optional.ofNullable(argo);
Optional<String> name = optInsurance.map(Insurance::getName);
System.out.println(getCarInsuranceName(Optional.of(p1)));
System.out.println(getCarInsuranceName(Optional.of(p)));
}
}
我正在为Optional.of(p)行获取NPE,我知道p1有一辆车并且该车有保险,所以可以工作。
在 p 的情况下,保险不存在,所以我得到 NPE。 但如果我使用Optional.empty()执行此操作,我会正确地得到Unknown作为输出。
如何使其更普遍,如果有任何东西损坏,我会得到未知?
最佳答案
基本上,简短的答案是“你不能”。原因是 Optional
应该是一个 monad(一个高阶对象,允许您将某些操作包装在某个容器中,简称),但在 Java 中,它不是。因此,flatMap
无法正确链接。对于更长的讨论,您可能需要查看 https://www.sitepoint.com/how-optional-breaks-the-monad-laws-and-why-it-matters/
关于java - 如何为对象链创建 flatMap 链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56523759/