我本人的观点是:  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 实例, 假定我们有一个实例 Optional<User> user, 下面是几个普遍的, 应避免 if(user.isPresent()) { ... } else { ... } 几中应用方式.
  存在即返回, 无则提供默认值
  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;
  }
  针对这方面 Groovy 提供了一种安全的属性/方法访问操作符 ?.
  user?.getUsername()?.toUpperCase();
  Swift 也有类似的语法, 只作用在  Optional 的类型上.
  用了 isPresent() 处理 NullPointerException 不叫优雅, 有了  orElse, orElseGet 等, 特别是 map 方法才叫优雅.
  其他几个, filter() 把不符合条件的值变为 empty(),  flatMap() 总是与 map() 方法成对的,  orElseThrow() 在有值时直接返回, 无值时抛出想要的异常.
  一句话小结: 使用 Optional 时尽量不直接调用 Optional.get() 方法, Optional.isPresent() 更应该被视为一个私有方法, 应依赖于其他像 Optional.orElse(), Optional.orElseGet(), Optional.map() 等这样的方法.
  后, 好的理解 Java 8 Optional 的方法莫过于看它的源代码 java.util.Optional, 阅读了源代码才能真真正正的让你解释起来有底气, Optional 的方法中基本都是内部调用  isPresent() 判断, 真时处理值, 假时什么也不做.