一 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,
如果有值,直接返回;否则自定义的由函数生成的值
map 函数隆重登场
return
user.orElseGet(() -> fetchAUserFromDatabase());
//而不要 return user.isPresent() ? user: fetchAUserFromDatabase()
四: ifPresent, 存在才对它做点什么:
user.ifPresent(System.out::println);
五:
当user.isPresent()
为真, 获得它关联的orders
, 为假则返回一个空集合时, 我们用上面的orElse
,orElseGet
方法都乏力时, 那原本就是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接口创建的异常;