JDK8新特性——Optional工具类

JDK8新特性----玩转Optional工具类

1. 基本概念

​ Java 8 中引入了一个有趣的特性是Optional类,该工具类的引入主要是为了解决空指针异常(NullPointException)。本质上,这是一个包含有可选值的包装类,意味着类本身亦可以有值也可以为Null。

2.方法

方法描述
of()把指定的值封装成Optional对象并返回,如果参数为null,贼会抛出空指针异常(不可以传null值)
ofNullable()把指定的值封装为Optional对象并返回,如果参数为null,则创建一个空的Optional对象(可以传null值)
empty()创建一个空的Optional对象
get()如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException
orElse()如果创建的Optional中有值存在,则返回此值,否则返回一个默认值(即返回传入的参数)
orElseGet()如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口(参数)生成的值
orElseThrow()如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier(参数)接口生成的异常
filter()如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象
map()如果创建的Optional中有值存在,则应用提供的映射函数,如果结果不为空,则封装成Optional返回,否则返回一个空的Optional
flagMap()如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
isPresent()如果创建的Optional中的值存在,返回true,否则返回false
ifPresent()如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做

3.方法详解

  1. of() 和 ofNullable()

    // 传入null值会抛出异常,所以参数必须确保非空
    Optional<String> op = Optional.of("Ye")
    
    // 为指定的值创建Optional对象,不管所传入的值为null不为null,创建的时候都不会报错
    Optional<String> nullOptional = Optional.ofNullable(null);
    Optional<String> nullOptional = Optional.ofNullable("Ye");
    

    当我们明确参数不为null时我们使用of(),否则我们应该使用ofNullable()来摆脱空指针异常都影响。

  2. empty

    // 创建一个为空的Optional对象
    Optional<String> emptyOptional = Optional.empty();
    
  3. get() | orElse() | orElseGet()

    1. get()

      // 获取Optional对象中封装的值
      String s = Optional.of("Value").get()
      
      // 当Optional对象封装的值为空的时候会抛出异常,所以一般可结合isPresent()使用
      Optional<String> op = Optional.ofNullable("Ye")
      if (op.isPresent()) {
      	String name = op.get()
      }
      
    2. orElse() 和 orElseGet()

      // 当Optional对象中值为null时返回默认值,避免空指针异常的可能
      String name = Optional.ofNullable(name).ofElse("Ye")
      
      // 这个方法会在有值的时候返回值,如果没有值,它会执行作为参数传入的 Supplier(供应者) 函数式接口,并将返回其执行结果
      User result = Optional.ofNullable(user).orElseGet( () -> user2);
      

      当参数都为一个方法的时候,如果Optional中封装的值为null,则两方法无差异;当Optional封装的值不为null的时候,orElse()仍然会执行参数中方法,orElseGet()则不会。这个区别使得两者在性能上有所差异。

  4. orElseThrow()

    // 当Optional封装值为空的时候,会抛出你指定的异常
    User result = Optional.ofNullable(user).orElseThrow( () -> new IllegalArgumentException());
    

    ​ 这个方法用于在对象为null时抛出我们想要的异常而非空指针,方便于定位和处理问题

  5. filter()

    // filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional。
    Optional<String> op = Optional.of(user).filter(() -> String.isNotEmpty(user.name))
        
    // 由于该方法返回的是Optional对象,这使得我们可以在一行代码中过滤符合指定条件的数据进行处理
    // 过滤出具有权限的user(或user为null也会返回true的方法),获取他们的值,如果为null则返回新user
    User user = Optional.ofNullable(user).filter(u -> u.permission()).orElseGet(creatNewUser())
    
  6. map() 和 flatMap()

    // 如果创建的Optional中的值存在,对该值进行操作返回结果(一般用来转换值或取得其中属性),返回的值为Optional,可执行链式编程(后接orElse()等)
    String userName = Optional.ofNullable(user).map(user -> user.getName()).orElse("姓名未填写")
    

    一般利用该方法进行封装值的转换和属性提取,避免了只能对原始类型Optional的操作和获取。

    // flatMap() 与 map()方法类似,但是参数Predicate返回的值必须是Optional,返回结果也不会进行封装
    String userName = Optional.ofNullable(user).flatMap(user -> Optional.ofNullable(user.getName()).orElse("姓名未填写")
    
  7. isPresent() 和 ifPresent()

    // isPresent()可用来对Optional判空,在Optation内部代码中实现判断逻辑 
    Optional.ofNullable.isPresent()
    // ifPresent()用于简化if结合判空的使用,内部传入Predicate参数,只进行内部处理没有返回值
    Optional.ofNullable(user).ifPresent(() -> user = new User())
    
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值