【Java 8】 Optional 协助判空

本文介绍了Java8中Optional类的作用,用于简化判空逻辑,以及如何通过方法引用和链式调用来使用Optional。重点解释了orElse在null值处理中的作用,以及EMPTY对象的特殊性。
摘要由CSDN通过智能技术生成

【Java 8】 Optional 协助判空

  • Mentor 说老代码一大堆判空 太丑了 叫我用 Optional 来写。

什么是 Optional 类

  • Optional 类是 JDK1.8 加入的类,新功能,常用于协助判空。

  • 什么叫协助判空,就是代码中的对象可能会有null 的情况,对null 进行操作可能会产生 NPE(Null Pointer Exception),所以在代码里,你就需要经常 if 它们看它们是否为 null;然而 Optional 出现了,使用了他,你就不用一直 if 是不是为空了。

    • 比如说 proto.getData() 而 proto 为 null,那么就会NPE。
  • 例子1:

    • Before:

      • if (user != null) {
            Address address = user.getAddress();
            if (address != null) {
                Country country = address.getCountry();
                if (country != null) {
                    String isocode = country.getIsocode();
                    if (isocode != null) {
                        isocode = isocode.toUpperCase();
                    }
                }
            }
        }
        
    • After:

      • return Optional.ofNullable(user)
          .map(User::getAddress)
          .map(Address::getCountry)
          .map(Country::getIsocode)
          .map(String::toUpperCase)
          .orElse(null);
        
  • 什么是 :: ?

    • double colon,也叫做方法引用(Method Reference),是Java 8 中 Lambda 表达式写法之一。为简化冗余的 Java 编程。
    • 形如 ClassName::methodName 或者 objectName::methodName
    • JVM 不支持方法引用,JDK8 对方法引用的支持 是编译器层面 的支持,编译器推断开发者用途,并复原成接口实现对象,这样JVM并不会感受到区别。
      • 编译器需要推断意图,所以使用方法引用的方法必须是函数式接口
    • 什么是函数式接口
      • 只有一个抽象方法的接口。
      • 可以使用 @FuncationInterface 注解来标识,如果有超过一个抽象方法,注解会通知编译器并报错。

怎么理解这些Optional 的使用代码?

  • 如果直接看别人的代码,然后抄,我可能还不会疑惑,但是看了一下介绍和源码注释之后,我就更加不能理解了!

  • 我的疑惑orElse 是 value 为null 的时候才返回传入的值,那前面的 mapofNullable 如果判空不是会返回一个EMPTY吗?也就是空的 Optional 对象,那空的Optional对象不等于 null 吧,那怎么能返回传入的值呢?

    • private static final Optional<?> EMPTY = new Optional<>();
      
      private final T value;
      
      public static <T> Optional<T> ofNullable(T value) {
          return value == null ? empty() : of(value);
      }
      
      public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
      }
      
      private Optional() {
        this.value = null;
      }
      
  • 理解:然后突然理解了,Optional 里面有一个 value 存的是你的数据,他是有可能为 null 的,而 Optinal 里面如 ofNullable 遇到null 值 会返回一个 EMPTY,而 EMPTY 实际上是一个空的 Optional 对象,而查看代码可以看到 Optional 的无参构造器里, 设置value 值为null,所以 EMPTY 是个value 为 null 的 Optional 对象,不会报NPE,并且后面 Optional 的方法中判空都是判断value,EMPTY 一样会被判断为null。

    • 也就是说 EMPTY 对象会返回 orElse 传入的参数。

Reference

  • 网上的各种资料。
  • https://blog.csdn.net/Thinkingcao/article/details/123372838?spm=1001.2014.3001.5506
  • 方法引用:https://blog.csdn.net/ChineseSoftware/article/details/122981983?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-1-122981983-blog-123805088.235
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值