传统方式处理null
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; } }
Optional容器类避免null
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; } }