三种构造
// obj 不能为null值,否则直接快速抛出NullpointException
Optional.of(obj);
// 允许为null,但是如果传入null,就得到了 Optional.empty()
// 不是null,则会获取 Optional.of(obj)
Optional.ofNullable(obj)
// 空的Optional
Optional.empty()
何时使用每种构造?
Optional.of(obj):
- 明确obj不可能为null
- 明确obj为null,并快速抛出异常
Optional.ofNullable(obj):
- 不明确obj是否为null,又要对obj进行处理的
存在即返回,无则提供默认值
User u = Optional.ofNullable(user).orElse(User.UNKNOWN_USER);
存在即返回,无则由函数生成
User u = Optional.ofNullable(user).orElseGet(() -> new User());
存在则返回, 无则抛出异常
User u = Optional.ofNullable(user).orElseThrow(() -> new IllegalArgumentException());
变种,存在则返回,无则抛出空指针异常:
User u = Objects.requireNonNull(user,"用户信息获取异常,无法进行操作");
存在才执行, 无则不会执行
Optional.ofNullable(user).ifPresent(uu -> System.out.println(uu));
map 处理级联数据
有一 user 对象,不知是否为null
如果为null,返回null
如果不为null,返回 name
如果name 为null,返回 null
如果name 不为null, 将name 转换为大写
这种级联的null 处理,需要使用map, map可以嵌套无数层。
String n = Optional.ofNullable(user).map(u -> u.getName()).map(name -> "姓名:" + name).orElse(null);
flatMap:flatMap
同 map
类似,只是参数不同,他的函数参数需要返回 Optional
类型:
String n = Optional.ofNullable(user).flatMap(u -> Optional.ofNullable(u.getName())).map(name -> "姓名:" + name).orElse(null);
总结
一句话小结: 使用 Optional 时尽量不直接调用 Optional.get()
方法, Optional.isPresent()
更应该被视为一个私有方法, 应依赖于其他像 Optional.orElse()
, Optional.orElseGet()
,Optional.map()
等这样的方法.