文档详情

使用Java8Optional的正确姿势.doc

发布:2017-03-11约4.76千字共6页下载文档
文本预览下载声明
使用 Java 8 Optional 的正确姿势我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional. 如果对它不稍假探索, 只是轻描淡写的认为它可以优雅的解决 NullPointException 的问题, 于是代码就开始这么写了OptionalUser user = ...... if (user.isPresent()) { return user.getOrders(); } else { return Collections.emptyList(); } 那么不得不说我们的思维仍然是在原地踏步, 只是本能的认为它不过是 User 实例的包装, 这与我们之前写成 User user = ..... if (user != null) { return user.getOrders(); } else { return Collections.emptyList(); } 实质上是没有任何分别. 这就是我们将要讲到的使用好 Java 8 Optional 类型的正确姿势. 在里约奥运之时, 新闻一再提起五星红旗有问题, 可是我怎么看都看不出来有什么问题, 后来才道是小星星膜拜中央的姿势不对. 因此我们千万也别对自己习以为常的事情觉得理所当然, 丝毫不会觉得有何不妥, 换句话说也就是当我们切换到 Java 8 的 Optional 时, 不能继承性的对待过往 null 时的那种思维, 应该掌握好新的, 正确的使用 Java 8 Optional 的正确姿势. 直白的讲, 当我们还在以如下几种方式使用 Optional 时, 就得开始检视自己了 调用?isPresent()?方法时 调用?get()?方法时 Optional 类型作为类/实例属性时 Optional 类型作为方法参数时 isPresent()?与?obj != null?无任何分别, 我们的生活依然在步步惊心. 而没有?isPresent()?作铺垫的?get()?调用在 IntelliJ IDEA 中会收到告警 Reports calls to java.util.Optional.get() without first checking with a isPresent() call if a value is available. If the Optional does not contain a value, get() will throw an exception. (调用 Optional.get() 前不事先用 isPresent() 检查值是否可用. 假如 Optional 不包含一个值, get() 将会抛出一个异常) 把 Optional 类型用作属性或是方法参数在 IntelliJ IDEA 中更是强力不推荐的 Reports any uses of java.util.OptionalT, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong or mon.base.Optional as the type for a field or a parameter. Optional was designed to provide a limited mechanism for library method return types where there needed to be a clear way to represent “no result”. Using a field with type java.util.Optional is also problematic if the class needs to be Serializable, which java.util.Optional is not. (使用任何像 Optional 的类型作为字段或方法参数都是不可取的. Optional 只设计为类库方法的, 可明确表示可能无值情况下的返回类型. Optional 类型不可被序列化, 用作字段类型会出问题的) 所以 Optional 中我们真正可依赖的应该是除了?isPresent()?和?get()?的其他方法: publicU OptionalU map(Function? super T, ? extends U mapper) public T orElse(T other) public T orElseGet(Supplier? extends T other) public void ifPresent(Consumer? super T con
显示全部
相似文档