Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为对象链制作平面贴图链?_Java_Java 8_Optional_Flatmap - Fatal编程技术网

Java 如何为对象链制作平面贴图链?

Java 如何为对象链制作平面贴图链?,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

我有以下的班级定义

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 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
!还有什么比这更糟糕的呢?你搞错了,看看答案的注释,看看为什么一件事有效而另一件事无效。