Optional类

Optional类

Optional类概述

概述:Optional<T>类是Jdk1.8之后提供的一个容器类,Optional类的对象中可以存储或者接收一个其他的对象或者	      数据
好处:
	(1)可以更好的解决和处理对象的空指针异常
	(2)支持函数型接口的使用和链式编程的开发方式

Optional类使用举例

public static void main(String[] args) {
        Person p = new Person("张三",23);
        //p = null;
        //传统方式避免空指针异常,访问对象数据
        if(p != null){
            String name = p.getName();
            if(name == "张三"){
                System.out.println(p.toString());
            }
        }
        //Optional类避免空指针异常访问数据
        Optional.ofNullable(p).
                filter(x -> x.getName() == "张三").ifPresent(System.out::println);
    }

Optional类的常用方法

Method(方法)Desc(描述)
Optional.of(T t)创建一个非空值的Optional实例
Optional.empty()创建一个空的Optional实例
Optional.ofNullable(T t)创建一个Optional实例,如果t值为null,返回一个空实例
isPresent()判断Optional实例中是否包含值
ifPresent(Consumer c)如果Optional实例中存在值,则按照参数处理该值,否则不执行任何操作
get()获取Optional实例中存储的值,否则抛出 NoSuchElementException
orElse(T t)如果Optional实例包含值,则返回该值,否则返回参数 t
orElseGet(Supplier s)如果Optional实例包含值,则返回该值,否则返回s中获取的值
orElseThrow(Supplier s)如果Optional实例为空,则返回自定义异常信息
filter(Predicate p)对Optional对象中的值判断,如果判断结果为true,则返回该值;否则返回空容器对象
map(Function f)如果Optional对象中有值,则通过参数对值处理,将处理之后的结果封装到一个新的Optional对象中返回;如果没有值,则返回一个空的Optional对象
flatmap(Function f)效果与功能与map相同,但是处理之后的数据需要自主封装到Optional对象中

Optional类方法演示

创建Optional实例
  • Optional.of(T t)

    注意:因为Optional类构造被私有化,不能手动创建,只能获取

 //获取一个对象
 //获取的对象可能是从其他地方得来的,并不确定是否是null
   Person p = new Person("张三",23);
//获取一个Optional容器对象,确定此对象不为null使用此方式
//若传入的地址为null,则抛出 NUllPointException
   Optional<Person> opt1 = Optional.of(p);
  • Optional.empty()
//获取一个没有值的空容器对象
  Optional<Object> opt2 = Optional.empty();
  • Optional.ofNullable(T t) 【常用】
//获取一个对象
//获取的对象可能是从其他地方得来的,并不确定是否是null
  Person p = new Person("张三",23);
//获取一个Optinal容器对象,不确定传入的对象是否是空时使用此方法
//传入的对象可能不为Null,如果不为null则返回一个包含该值的容器对象
  Optional<Person> opt3 = Optional.ofNullable(p);
//传入的对象可能为Null,如果为null则返回一个空容器对象
  p = null;
  Optional<Person> opt4 = Optional.ofNullable(p);
获取Optional中的值
  • get()

    **注意:**传入的对象为null,抛出NoSuchElementException ,否则返回容器中的值

  Person p = new Person("张三",23);
  Optional<Person> opt = Optional.ofNullable(p);
//获取容器对象中的数据
  Person p2 = opt.get();

  Optional<Object> opt2 = Optional.ofNullable(null);
//容器对象中的对象为null,抛出 NoSuchElementException 
  Object o = opt2.get();
判断Optional中是否有值
  • isPresent()

    **注意:**判断容器中的数据是否是空,如果为空就返回true,否则返回false

  Person p = new Person("张三",23);
  Optional<Person> opt = Optional.ofNullable(p);
  if(opt.isPresent()){
     System.out.println(opt.get());
  }
消费Optional中的值
  • ifPresent(Consumer c)
  Person p = new Person("张三",23);
//如果Optional容器中有值,就值按照指定消费型接口的功能处理
//如果Optional容器中没有纸,就不做任何处理
  Optional.ofNullable(p).ifPresent(System.out::println);
兜底函数
  • orElse(T t)

​ 注意:如果容器中有值就返回该值,否则返回 t

​ 返回的是容器中的值,不是 Optional对象

  Person  p = new Person("张三",23);
//如果容器对象中有值,就返回该值,没有值就返回orElse参数中的值
   Person p2 = Optional.ofNullable(p).orElse(new Person("李四", 24));
  • orElseGet(Supplier s)

    **注意:**如果容器中有值就返回该值,否则返回供给型接口提供的值

    ​ 返回的是容器中的值,不是Optional对象

  Person p = new Person("张三",23);
//如果容器对象中有值,就返回该值,没有值就返回orElse参数中的值
  Optional.ofNullable(p).orElseGet(()->new Person("李四",24));

以上两种方式区别:

当Optional对象中值为null时,都会执行参数中的内容
当Optional对象中值不为null时,orElse会继续执行参数内容,但是不会返回数据
                              orElseGet不会执行参数内容
  • orElseThrow(Supplier s)
 Person p = new Person("张三",23);
//如果Optional容器中传入的数据不为null,则返回改数据
 Person p2 = Optional.ofNullable(p).orElseThrow(RuntimeException::new);
//如果Optional容器中传入的数据为null,就抛出参数中创建的异常
 Optional.ofNullable(null).orElseThrow(RuntimeException::new);
过滤函数
  • filter(Predicate p)

    **注意事项:**如果Optional中的数据不为null,且经过filter参数的判断方式为true,则返回该数据

    ​ 否则返回空的Optional容器对象

Person p = new Person("张三",23);
Optional<Person> p2 = Optional.ofNullable(p).filter(x -> x.getName() == "张三");
System.out.println(p2);//张三,23
转换函数
  • map(Function f)

    如果Optional容器中的数据不为null,则按照函数型接口的方式处理该数据,并返回一个新的数据

    如果Optional容器中的数据为null,则返回一个空的Optional对象

    **注意事项:**返回的是一个Optional对象

Person p = new Person("张三",23);
Optional<String> s = Optional.ofNullable(p).map(x -> x.getName());
System.out.println(s);//张三
  • flatmap(Function f)

    如果Optional容器中的数据不为null,则按照函数型接口的方式处理该数据,并返回一个新的数据

    如果Optional容器中的数据为null,则返回一个空的Optional对象

    注意事项:

    • 返回的是一个Optional对象
    • 返回的Optional对象需要自主创建
Person p = new Person("张三",23);
Optional<String> s = Optional.ofNullable(p).flatMap(x -> Optional.ofNullable(x.getName()));
System.out.println(s);//张三

总结

  • 可以实现链式编程,加强代码的可读性,可维护性,提升简洁度
  • 可以在设计类型时,将一个对象类型的成员变量定义为Optional类型,加强对该变量的维护
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值