JAVA8(五)用Optional取代null
创建Optional对象
1.声明一个空的Optional:通过静态工厂方法Optional.empty,创建一个空的Optional对象
2.依据一个非空值创建Optional:Optional.of(obj)要求传入的 obj 不能是 null,否则会抛出NullPointerException
3.可接受null的Optional:Optional.ofNullable(obj)
Optional常用API
方法 | 描述 |
Optional<T> filter(Predicate<? super <T> predicate) | 如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。Predicate的函数描述符:T -> boolean |
<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper) |
如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。Function的函数描述符:T -> R
|
<U>Optional<U> map(Function<? super T,? extends U> mapper) | 与flatMap类似,不过map方法的mapping函数返回值可以是任何类型T |
boolean isPresent() | 如果值存在则方法会返回true,否则返回 false |
void ifPresent(Consumer<? super T> consumer) | 如果值存在则使用该值调用 consumer , 否则不做任何事情。Consumer的函数描述符:T -> void |
T get() | 如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException |
T orElse(T other) | 如果存在该值,返回值, 否则返回 other。 |
代码示例:
package optional.domain; import java.util.Optional; public class Person { private Optional<Car> car; public Optional<Car> getCar() { return car; } public void setCar(Optional<Car> car) { this.car = car; } } package optional.domain; import java.util.Optional; public class Car { private Optional<Insurance> insurance; public Optional<Insurance> getInsurance() { return insurance; } public void setInsurance(Optional<Insurance> insurance) { this.insurance = insurance; } } package optional.domain; public class Insurance { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } package optional; import java.util.Optional; import optional.domain.Car; import optional.domain.Insurance; import optional.domain.Person; public class Test { public static void main(String[] args) { Optional<Person> optPerson = Optional.ofNullable(new Person()); Optional<String> name = optPerson.flatMap(Person::getCar).flatMap(Car::getInsurance).map(Insurance::getName); optPerson.map(Person::getCar); } }