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

 

posted @ 2020-02-21 15:25  鄙人取个名字好难  阅读(269)  评论(0编辑  收藏  举报