首页 > 代码库 > 用optional取代null

用optional取代null

  Java8引入了java.util.Optional<T>,它是一个封装的Optional值的类。变量存在时,Optional类只是对类简单封装。变量不存在时,缺失的值会被建模成一个空的Optional对象,由方法Optional.empty()返回。Optional.empty()是一个静态工厂方法,返回Optional类的特定单一实例。

  在代码中应始终如一的使用Optional,能非常清晰地界定出变量值的缺失时结构上的问题还是算法上的缺陷,抑或是数据中的问题。引入Optional并非要消除每个null引用,它的目标是帮助你更好的设计出适合的API。

  

  创建Optional对象

    声明一个空的Optional    

      Optional<Car> optCar = Optional.empty();

    创建一个非空的Optional,若car为null,则抛出NullPointerException

      Optional<Car>optCar = Optional.of(car);

    可接受null的Optional

      Optional<Car> optCar = Optional.ofNullable(car);

    

  Optional提供了一个map方法。map操作会将提供的函数应用于流的每个元素,可以把Optional对象看成一种特殊的集合数据,它至少包含一个元素。若Optional包含一个值,那map就讲该值作为参数传递给map,对该值进行转换。若Optional为空,则什么都不做。

    Optional<Instance> optInstance = Optional.ofNullable(instance);

    Optional<String> name = optInstance.map(Instance::getName);

 

  Optional提供了flatMap方法。flatMap方法接受一个函数作为参数,这个函数的返回值是另一个流。flatMap会应用到流中的每个元素并形成一个新的流,但flatMap会用流的内容替换每个新生成的流。即由方法生成的各个流会被合并或扁平化为一个单一的流。该调用逻辑上可划分为两步:第一。某个Function作为参数,被传递给由Optional封装的对象,对其进行转换。Function的具体表现是一个方法引用,返回一个Optional对象,最终两个Optional对象会被flatMap合并。可以将这种合并操作简单的看成把两个Optional对象结合在一起,若其中有一个对象为空,就构成一个空的Optional对象,若对一个空的Optional对象调用flatMap,则返回一个空的Optional。Optional类没有实现Serializable接口。

 

  Optional提供了isPresent()方法,若Optional对象包含值,则返回true。

 

  Optional提供了以下方法读取Optional实例中的值:

    get():若变量存在,则直接返回封装的变量值,否则抛出一个NoSuchElementException。

    orElse(T):允许在Optional对象不包含值时提供一个默认值

    orElseGet(Supplier<? extends T>):某个方法在Optional对象不含值时被调用

    orElseThrow(Supplier<? extends T>):当Optional不存在时抛出指定异常

    ifPresent(Consumer<? super T>):变量值存在时执行一个作为参数存在的方法

 

  Optional的filter方法接受一个谓词作为参数,若Optional对象存在并且它符合谓词的条件,filter方法就返回其值,否则它就返回一个空的Optional对象。

 

  Optional提供了基础类型的Optional,如OptionalInt,OptionalLong以及OptionalDouble。但是基础类型不支持map,flatMap及filter方法。Optional对象无法由基础类型的Optional组合构成。

 

用optional取代null