JDK_8新特性_Optional容器类

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

猜你喜欢

转载自www.cnblogs.com/Small-music/p/9485753.html
今日推荐