Java 如何为对象链制作平面贴图链?
我有以下的班级定义 Insurance.javaJava 如何为对象链制作平面贴图链?,java,java-8,optional,flatmap,Java,Java 8,Optional,Flatmap,我有以下的班级定义 Insurance.java package Chapter10; public class Insurance { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } java package Chapter1
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;
}
}
package第10章;
导入java.util.Optional;
公车{
私人选择保险;
公共保险(){
退货保险;
}
公共保险(可选保险){
这个。保险=保险;
}
}
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;
}
}
package第10章;
导入java.util.Optional;
公共阶层人士{
私家车;
公共可选getCar(){
返回车;
}
公共车辆(可选车辆){
这辆车;
}
}
现在,我有以下主类,但我得到了NullPoinerException
对于个人p
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)));
}
}
package第10章;
导入java.util.Optional;
公共类光学测试器{
公共静态字符串getCarInsuranceName(可选人员){
返回person.flatMap(person::getCar)
.flatMap(汽车::getInsurance)
.map(保险::getName)
.orElse(“未知”);
}
公共静态void main(字符串[]args){
保险iffco=新保险();
iffco.setName(“iffco东京”);
保险argo=新保险();
argo.setName(“HDFC argo”);
i10车=新车();
i10.setInsurance(可选)(iffco);
Car santro=新车();
人员p=新人员();
p、 setCar(可选)(桑特罗);
人员p1=新人员();
p1.设置车(可选)(i10);
System.out.println(“--------------从个人获得保险-----------------”;
Optional optInsurance=Optional.ofNullable(argo);
可选名称=optInsurance.map(保险::getName);
System.out.println(getCarInsuranceName(可选)(p1));
System.out.println(getCarInsuranceName(可选的)of(p));
}
}
我得到了可选线路的NPE。关于(p),我知道p1有一辆车,而且那辆车有保险,所以可以工作
在p的情况下,保险不存在,所以我得到NPE。
但如果我使用Optional.empty()执行此操作,则正确地将Unknown作为输出
我怎样才能更概括地说,如果有什么东西坏了,我会得到未知的答案呢?基本上,简短的回答是“你不能”。这样做的原因是
Optional
应该是monad(简而言之,这是一个更高阶的对象,允许您将某些操作包装到特定的容器中),但在Java中,它不是。因此,flatMap
s不能正确链接。要进行更长时间的讨论,您可能希望看到santro car Insurance中的为空
导入java.util.Optional
公共类光学测试器{
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();
santro.setInsurance(Optional.of(argo)); \\ Insurence was null.
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)));
}
公共静态字符串getCarInsuranceName(可选人员){
返回person.flatMap(person::getCar)
.flatMap(汽车::getInsurance)
.map(保险::getName)
.orElse(“未知”);
}
公共静态void main(字符串[]args){
保险iffco=新保险();
iffco.setName(“iffco东京”);
保险argo=新保险();
argo.setName(“HDFC argo”);
i10车=新车();
i10.setInsurance(可选)(iffco);
Car santro=新车();
santro.setInsurance(可选的.of(argo));\\insurance为空。
人员p=新人员();
p、 setCar(可选)(桑特罗);
人员p1=新人员();
p1.设置车(可选)(i10);
System.out.println(“--------------从个人获得保险-----------------”;
Optional optInsurance=Optional.ofNullable(argo);
可选名称=optInsurance.map(保险::getName);
System.out.println(getCarInsuranceName(可选)(p1));
System.out.println(getCarInsuranceName(可选的)of(p));
}
}换辆车应该行得通 公车{
private Insurance insurance;
public Optional<Insurance> getInsurance() {
return Optional.ofNullable(insurance);
}
public void setInsurance(Optional<Insurance> insurance) {
this.insurance = insurance.orElse(null);
}
}
私人保险;
公共保险(){
可选择退货。不可退货(保险);
}
公共保险(可选保险){
this.insurance=insurance.orElse(空);
}
}
Suggestion-不要将Optional
用作属性类型和方法参数。仅作为一个示例,即使这样也可以解决问题类Car{private Insurance;public Optional getInsurance(){return Optional.ofNullable(Insurance);}}}
我在实际操作中使用了Java 8中的示例,但我将它的属性类型保留为可选的,只是为了表示这些值可能不会在psvm或任何使用它的人中设置。任何一个它不起作用的原因…@Naman得到了区别,在我的例子中,可选的保险是null,在它上面调用map会给出NPE,在您建议的编辑中,Car::getInsurance会给出Optional.ofNullable(null),这是可选的,没有任何内容,Optional.empty,因此map不做任何事情,orElse被返回到Dect…然后想象一下使用Optional
属性计算为null
!还有什么比这更糟糕的呢?你搞错了,看看答案的注释,看看为什么一件事有效而另一件事无效。