【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 的时候才返回传入的值,那前面的map
和ofNullable
如果判空不是会返回一个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