说实话, 我第一次知道这个东西是从阿里规约中, 因为公司前一段时间一直在搞代码审核, 我的代码写的就感觉很烂, 就像规范下. 让别人看起来没那么烂. 于是就开始看阿里规约, 在看到 NPE 处理的时候, 上面提到用 Optional 类进行处理. 这就是我第一次知道这个东东.
Optional 简介
Optional 类是一个可以为 null 的容器对象. 如果值存在则 isPresent() 方法会返回 true, 调用 get() 方法会返回该对象.
Optional 是个容器: 它可以保存类型 T 的值, 或者仅仅保存 null.Optional 提供很多有用的方法, 这样我们就不用显式进行空值检测.
Optional 类的引入很好的解决空指针异常.
Optional 源码查看
这里建议大家自行阅读其完整源码, 这里只分析 filter 和 map 方法
类的属性和方法
从图中我们可以看出, 它的构造方法都是 private 修饰的. 其实是一个单例模式的应用.
filter 方法
该方法是过滤方法, 过滤符合条件的 Optional 对象, 这里的条件用 Lambda 表达式来定义.
- public Optional<T> filter(Predicate<? super T> predicate) {
- // 如果入参 predicate 对象为 null 将抛 NullPointerException 异常
- Objects.requireNonNull(predicate);
- // 如果 Optional 对象的值为 null, 将直接返回该 Optional 对象
- if (!isPresent())
- return this;
- // 如果 Optional 对象的值符合限定条件 (Lambda 表达式来定义), 返回该值, 否则返回空的 Optional 对象
- else
- return predicate.test(value) ? this : empty();
- }
map 方法
map 方法用于修改该值, 并返回修改后的 Optional 对象, 一般会在多级取值的时候用到
- public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
- // 如果入参 mapper 对象为 null 将抛 NullPointerException 异常
- Objects.requireNonNull(mapper);
- // 如果 Optional 对象的值为 null, 将直接返回该 Optional 对象
- if (!isPresent())
- return empty();
- // 执行传入的 lambda 表达式, 并返回经 lambda 表达式操作后的 Optional 对象
- else {
- return Optional.ofNullable(mapper.apply(value));
- }
- }
实战演练
判断不为 null 然后进行操作
- /**
- * 不为 null 时进行操作
- *
- * @param name
- */
- public static void doThing(String name) {
- if (name != null) {
- System.out.println(name);
- }
- }
- public static void doThingOptional(String name) {
- Optional.ofNullable(name)
- .ifPresent(System.out::println);
- }
多层级取值
- /**
- * 多级取值
- *
- * @param user
- * @return
- */
- public static String getAddress(UserEntity user) {
- if (user != null) {
- AddressEntity addressEntity = user.getAddressEntity();
- if (addressEntity != null) {
- String address = addressEntity.getAddress();
- if (address != null && address.length()> 3) {
- return address;
- }
- }
- }
- return null;
- }
- public static String getAddressOptional(UserEntity user) {
- return Optional.ofNullable(user)
- .map(u -> u.getAddressEntity())
- .map(a -> a.getAddress())
- .filter(s -> s.length()> 3)
- .orElse(null);
- }
好了, 玩的开心.
来源: https://www.cnblogs.com/zhenghengbin/p/9499073.html