Java 8 Optional<T> 避免空指针异常

简介

为了简化空指针异常判断的代码书写

正常情况下

if (object !=null){
   object2 = object.getMethod();//可能是null
   if (obejct != null){
       o3 = object2.method();//可能又是null
       if ....
   }
}
复制代码

为了简化书写并适应Lambda表达式 遂引入Optional

细节就不扣了,直接上手

源码不能丢

image.png

要素察觉

实例化Optional的方法

  • empty()//创建空对象
  • of(T value)//创建非空对象
  • ofNullable(T value)//创建空非空对象

空对象也是对象

返回Optional的方法

  • filter(Predicate<? super T> predicate) //根据Predicate返回this或空对象
  • map(Function<? super T, ? extends U> mapper) //对非空value操作,并以其为参数构造Optional,再返回新的Optional
  • flatMap(Function<? super T, Optional<U>> mapper//对非空this.value操作,再返回this

获取成员变量value的方法

  • get() //经典get方法
  • orElse(T other)// 如果value为空返回,other。
  • orElseGet(Supplier<? extends T> other)// 返回非空this.value,否则返回被操作过的other
  • public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)//返回非空value,否则抛出异常

功能性方法

  • boolean isPresent()//判断value是否为空
  • ifPresent(Consumer<? super T> consumer)//操作非空value不返回值

测试

public class OptionalTest {
    public static void main(String[] args) {
        People people = new People("Kitty",18);
        People people2 = new People("Google",30);
        Optional<People> optional = Optional.of(people);//将对象people包装
        optional.ifPresent( p -> p.setAge(20));//如果Optional非空,对p进行操作,p就是Optional的成员变量value
        System.out.println(optional.flatMap(p -> {
            p.setName("Jane");
            return Optional.of(p);//flatMap要返回Optional
        }).filter(p -> p.getAge() == 18).orElse(people2));
        optional.ifPresent(System.out::println);
    }
}
复制代码

image.png

解释

image.png

使用optional的注意点

Optional是基于值类型

Optional最基本使用

  • 不被推荐的写法
if(optional.isPresent()){
     各种骚操作
}
复制代码
  • 推荐写法
optional.ifPresent(用Lambda表达式,进行各种骚操作);
复制代码
  • Optional类的各种方法都有非空判断,随意使用

Optional是不可以序列化的

  • 所以不能当成其他类的成员变量
  • 所以不能成为方法参数,但返回值可以是它

总之,将对象丢进Optional中,防止空指针异常,顺便体验函数式编程

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享