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; }
}

相關文章
相關標籤/搜索