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

浙公网安备 33010602011771号