一 Optional

从Java8 引入的一个很有趣的特性是Optional类。Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException)。

   一: 创建Optional对象:

  Optional<String>  test = Optional.ofNullable(name);    // 可以为空,也可以不为空
  Optional<String> test = Optional.of(name); // 不能为空
  Optional<String> test = Optional.empty(); // 空对象
二: orElse, 如果有值,直接返回;否则返回指定的类型,类型必须是T

return user.orElse(null);  //而不是 return user.isPresent() ? user.get() : null;
三:
orElseGet,如果有值,直接返回;否则自定义的由函数生成的值
      return user.orElseGet(() -> fetchAUserFromDatabase()); //而不要 return user.isPresent() ? user: fetchAUserFromDatabase()
四: ifPresent, 存在才对它做点什么:
user.ifPresent(System.out::println);
五:
map 函数隆重登场
当 user.isPresent() 为真, 获得它关联的 orders, 为假则返回一个空集合时, 我们用上面的 orElseorElseGet 方法都乏力时, 那原本就是 map 函数的责任, 我们可以这样一行
return user.map(u -> u.getOrders()).orElse(Collections.emptyList())

map是可能无限级联的(前面的orElse,ifPresent没有级联的功能), 比如再深一层, 获得用户名的大写形式:
            return user.map(u -> u.getUsername())
                .map(name -> name.toUpperCase())
                .orElse(null);
             map:  如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional
 
     六: 一句话小结:
          使用 Optional 时尽量不直接调用 Optional.get() 方法, Optional.isPresent() 更应该被视为一个私有方法;
          应依赖于其他 像 Optional.orElse()Optional.orElseGet()Optional.map() 等这样的方法.
 
     补充:  
              orElseThrow:  如果有值则将其返回,否则抛出supplier接口创建的异常; 
原文地址:https://www.cnblogs.com/liufei1983/p/8124551.html