Java8 Optional的正确打开方式

Java8新推出了Optional,配合lambda,对null对象的处理变得cool起来,但是如何使用呢

先看Optional中的一些常用方法

- public<U> Optional<U> 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> consumer) 
- public Optional<T> filter(Predicate<? super T> predicate) 
- public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) 
- public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X

不佳方式使用 Optional 时直接调用 Optional.get()和Optional.isPresent()
这两个方法直接的使用没有太大意义,更应该被视为一个私有方法, 应依赖于其他像 Optional.orElse(), Optional.orElseGet(), Optional.map() 等这样的方法.

这里又不得不提一下 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).

正确的使用场景

  1. 存在即返回, 无则提供默认值
return user.orElse(null);  
//而不是 return user.isPresent() ? user.get() : null;
  1. 存在即返回, 无则由函数来产生
return user.orElseGet(() -> fetchAUserFromDatabase()); 
//而不要 return user.isPresent() ? user: fetchAUserFromDatabase();
  1. 存在才对它做点什么
user.ifPresent(System.out::println);
//而不要下边那样
if (user.isPresent()) {
  System.out.println(user.get());
}
  1. 对于层级比较深的可能为null的对象处理,使用map
return user.map(u -> u.getUsername()).map(name -> name.toUpperCase()).orElse(null);
发布了136 篇原创文章 · 获赞 94 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/somehow1002/article/details/102577130