public class TestOptional1 { /** * null-安全的第一种尝试:深层质疑 * @param person * @return */ public String getCarInsuranceName1(Person person) { if (person != null) { Car car = person.getCar(); if (car != null) { Insurance insurance = car.getInsurance(); if (insurance != null) { return insurance.getName(); } } } return "Unknown"; } /** * null-安全的第二种尝试:过多的退出语句 * @param person * @return */ public String getCarInsuranceName2(Person person) { if (person == null) { return "Unknown"; } Car car = person.getCar(); if (car == null) { return "Unknown"; } Insurance insurance = car.getInsurance(); if (insurance == null) { return "Unknown"; } return insurance.getName(); } } class Person { private Car car; public Car getCar() { return car; } } class Car { private Insurance insurance; public Insurance getInsurance() { return insurance; } } class Insurance { private String name; public String getName() { return name; } }
import java.util.Optional; /** * Optional类方法 * * empty 返回一个空的 Optional 实例 * filter 若是值存在而且知足提供的谓词,就返回包含该值的 Optional 对象;不然返回一个空的Optional 对象 * flatMap 若是值存在,就对该值执行提供的 mapping 函数调用,返回一个 Optional 类型的值,不然就返回一个空的 Optional 对象 * get 若是该值存在,将该值用 Optional 封装返回,不然抛出一个 NoSuchElementException 异常 * ifPresent 若是值存在,就执行使用该值的方法调用,不然什么也不作 * isPresent 若是值存在就返回 true,不然返回 false * map 若是值存在,就对该值执行提供的 mapping 函数调用 * of 将指定值用 Optional 封装以后返回,若是该值为 null,则抛出一个 NullPointerException异常 * ofNullable 将指定值用 Optional 封装以后返回,若是该值为 null,则返回一个空的 Optional 对象 * orElse 若是有值则将其返回,不然返回一个默认值 * orElseGet 若是有值则将其返回,不然返回一个由指定的 Supplier 接口生成的值 * orElseThrow 若是有值则将其返回,不然抛出一个由指定的 Supplier 接口生成的异常 */ public class TestOptional2 { public String getCarInsuranceName(Optional<Person> person) { return person.flatMap(Person::getCar) .flatMap(Car::getInsurance) .map(Insurance::getName) .orElse("Unknown"); } } class Person { private Optional<Car> car; public Optional<Car> getCar() { return car; } } class Car { private Optional<Insurance> insurance; public Optional<Insurance> getInsurance() { return insurance; } } class Insurance { private String name; public String getName() { return name; } }