java - 如何为对象链创建 flatMap 链?

标签 java java-8 option-type flatmap

我有以下类定义。

保险.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/

相关文章:

java - 在集合中查找单个对象,HashMap vs List filter

java - 为什么Java8中没有Optional.mapToInt()?

ios - Swift optional 需要澄清

java - 安心服务 : status code return

java - 有没有办法在堆栈中搜索带有 "any"参数的内容?

java - 在 Java 8 Nashorn JavaScript 引擎中并发加载脚本是否有意义

java - 如何迭代 Java 8 String Stream 并将行追加到 String?

通过 HTML5 视频元素的 Java 多媒体流

java - Spring-Hibernate 使用多个数据源/数据库

java - 是否可以使用流 API 来简化这种条件重写?