传统方式处理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; }
}