欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Optional类——Java8新特性

程序员文章站 2022-03-04 10:50:44
...

Optional类

从前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码,受到了Google Guava的启发,Optional类已经成为Java8类库中的一部分。

Optional其实是一个容器,他可以保存T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显示进行空值检测(if(obj!=null){···})

创建Optional

  • Optional.of(T value));返回一个Optional描述给指定的非null值
  • Optional.ofNullable(T value);返回一个Optional描述的值,如果为空返回一个空的Optional
  • Optional.empty();返回一个空的Optional
        Employee e1 = new Employee("张三",8000);
        Optional<Employee> opt = Optional.ofNullable(e1);
        //如果存在,打印employee,不存在返回空的Optional
        System.out.println(opt);

判断

返回值 方法名 说明
boolean isPresent() 判断是否包含对象
void ifPresent(Consumer<? super T> action) 如果有值就执行action,并且该值会作为参数传给它,否则什么都不做
void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) 如果有值就执行给定的操作,否则执行基于空的给定操作**(JAVA9新增)**

获取

返回值 方法名 说明
T get() 如果调用对象包含值,返回该值,否则抛出异常
T orElse(T other) 如果有值返回该值,否则返回指定other
T orElseGet(Supplier<? extends T> other) 如果有值返回该值,否则返回由Supplier接口实现提供的对象
T orElseThrow(Supplier<? extends X> exceptionSupplier) 如果有值返回该值,否则抛出由Supplier接口实现提供的异常
Optional or(Supplier<? extends Optional<? extends T>> supplier) 如果值存在返回一个Optional描述的值,否则返回一个 Optiona通过供给函数产生**(JAVA9新增)**
Stream stream() 如果有值返回包含该值的Stream,否则返回空Stream**(JAVA9新增)**
        Employee e2 = new Employee();
        Optional<String> opt2 = Optional.ofNullable(e2.getName());
        //如果有名字,返回他的名字,没有返回“无名氏”
        String name = opt2.orElse("无名氏");
        System.out.println("这个员工的名字为:"+name);

操作

返回值 方法名 说明
Optional filter(Predicate<? super T> predicate) 如果有值,判断是否符合predicate的条件,否则返回空
Optional map(Function<? super T,? extends U> mapper) 如果有值,对该值执行Function接口的实现代码,并返回一个Optional的结果,否则报空指针异常
Optional flatMap(Function<? super T,? extends Optional<? extends U>> mapper) 如果有值,返回基于Optional包含的映射方法的值,否则返回一个空的Optional
        Optional<Employee> opt3 = Optional.of(new Employee("李四",5000));
        //如果工资大于10000返回该对象,否则返回空
        Optional<Employee> opt33 = opt3.filter(e->e.getSalary()>10000);
        System.out.println(opt33);

        //为员工工资提高10%(如果opt333不为空)
        Optional<Employee> opt333 = opt3.map(e->{e.setSalary(e.getSalary()*1.1);return e;});
        System.out.println(opt333);

总结:

  • Java8中新增的类
  • Optional主要功能实现空指针检测
  • 不过这个类中提供了很多实用的扩展方法
  • Optional是Java实现函数式编程的强进一步