美文网首页
JAVA8新特性—Optional 类

JAVA8新特性—Optional 类

作者: 赫灵 | 来源:发表于2018-12-19 21:15 被阅读0次

Optional中为我们提供的方法

Optional 的三种构造方式

Optional.of(obj),  Optional.ofNullable(obj) , Optional.empty()

Optional.of(obj) : 它要求传入的 obj 不能是 null 值的, 否则还没开始进入角色就倒在NullPointerException 异常上了.

Optional.ofNullable(obj) : 它以一种智能的, 宽容的方式来构造一个 Optional 实例. 来者不拒, 传 null 进到就得到 Optional.empty() , 非 null 就调用 Optional.of(obj) .

那是不是我们只要用 Optional.ofNullable(obj) 一劳永逸, 以不变应万变的方式来构造 Optional 实例就行了呢? 那也未必, 否则 Optional.of(obj) 何必如此暴露呢, 私有即可

那是为什么呢?

  1. 当我们非常非常的明确将要传给 Optional.of(obj) 的 obj 参数不可能为 null 时, 比如它是一个刚 new 出来的对象( Optional.of(new User(...)) ), 或者是一个非 null 常量时; 

 2. 当想为 obj 断言不为 null 时, 即我们想在万一 obj 为 null 立即报告 NullPointException 异常, 立即修改, 而不是隐藏空指针异常时, 我们就应该果断的用 Optional.of(obj) 来构造 Optional 实例, 而不让任何不可预计的 null 值有可乘之机隐身于 Optional 中.

Optional 使用的正确姿势

存在即返回, 无则提供默认值

return user.orElse(null);  //而不是 return user.isPresent() ? user.get() : null;

return user.orElse(UNKNOWN_USER);

存在即返回, 无则由函数来产生

return user.orElseGet(() -> fetchAUserFromDatabase()); 

//而不要 return user.isPresent() ? user: fetchAUserFromDatabase();

存在才对它做点什么

user.ifPresent(System.out::println);

//而不要下边那样

if (user.isPresent()) {

  System.out.println(user.get());

}

map 函数隆重登场

当 user.isPresent() 为真, 获得它关联的 orders , 为假则返回一个空集合时, 我们用上面的 orElse , orElseGet 方法都乏力时, 那原本就是 map 函数的责任, 我们可以这样一行

return user.map(u -> u.getOrders()).orElse(Collections.emptyList())

//上面避免了我们类似 Java 8 之前的做法

if(user.isPresent()) {

  return user.get().getOrders();

} else {

  return Collections.emptyList();

}

map 是可以无限级联的, 比如再深一层, 获得用户名的大写形式

return user.map(u -> u.getUsername())

          .map(name -> name.toUpperCase())

          .orElse(null);

这要搁在以前, 每一级调用的展开都需要放一个 null 值的判断

User user = .....

if(user != null) {

  String name = user.getUsername();

  if(name != null) {

    return name.toUpperCase();

  } else {

    return null;

  }

} else {

  return null;

用了 isPresent() 处理 NullPointerException 不叫优雅, 有了  orElse, orElseGet 等, 特别是 map 方法才叫优雅.

其他几个, filter() 把不符合条件的值变为 empty() ,   flatMap() 总是与 map() 方法成对的,   orElseThrow() 在有值时直接返回, 无值时抛出想要的异常.

一句话小结: 使用 Optional 时尽量不直接调用 Optional.get() 方法, Optional.isPresent() 更应该被视为一个私有方法, 应依赖于其他像 Optional.orElse() , Optional.orElseGet() , Optional.map() 等这样的方法.

相关文章

  • JAVA8新特性-Optional类解决NPE问题

    ** JAVA8新特性-Optional类解决NPE问题** API介绍 1、Optional(T value),...

  • Optional源码分析(未完)

    Optional源码分析(未完) Optional 类是Java8的新特性,Optional是一个可以为null的...

  • Java-8-Optional类

    Java-8-Optional类 java8新特性之Optional类 空指针异常是一个运行时异常,对于这一类异常...

  • java8 - optional

    optional 是java8的新特性,The purpose of the class is to provid...

  • Java8新特性—Optional类

    Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用ge...

  • JAVA8新特性—Optional 类

    Optional中为我们提供的方法 Optional 的三种构造方式 Optional.of(obj), Opti...

  • Java8新特性 -Optional 类

    Java 8 新特性[https://www.runoob.com/java/java8-new-features...

  • Optional类

    Optional类为Java8新引入的一个类,Optional是一个可以为null的容器对象,Optional中的...

  • JAVA8- Optional-用法浅析

    JAVA8- Optional-用法浅析 简介 java8新引入optional特性,官方说法是更优雅的处理空指针...

  • Optional 类

    Optional 类 声明:java8新特性系列为个人学习笔记,参考地址点击这里,侵删!! 到目前为止,臭名昭著的...

网友评论

      本文标题:JAVA8新特性—Optional 类

      本文链接:https://www.haomeiwen.com/subject/sryskqtx.html