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