学习Optional最难的地方在于如何转变以往的思维,比如
我们判断一个类是否为空:
User user = .....
user != null;
如果我们的思维没有转变的话,就会写成:
Optional<User> user =
if (user.isPresent()) {
return user.get();
}
实际上这两种写法没有什么区别,一个是鲁迅,一个是周树人。
Optional的优势在于orElse, orElseGet 等方法,特别是map方法。
值得注意的是Optional类型不可序列化,因此不要将该类型用于类属性。
Optional的构造方法有三种:
1.Optional.of(obj)
要求传入的对象不能是null值的,否则会报 NullPointerException 异常
2.Optional.ofNullable(obj)
传入的对象是null,返回Optional.empty()。非null值调用Optional.of(obj)。
在得到了一个Optional实例之后,如何获得返回值呢?
1.orElse
存在,则返回对象。
不存在返回默认值
return user.orElse(null);
而不是
return user.isPresent() ? user.get() : null;
2.orElseGet
存在,则返回对象
不存在,由函数来产生
return user.orElseGet(() -> fetchAUserFromDatabase());
而不是
return user.isPresent() ? user: fetchAUserFromDatabase();
3.user.ifPresent(System.out::println);
而不是
if (user.isPresent()) {
System.out.println(user.get());
}
当要获取user的属性时,我们可以用map方法:
return user.map(u -> u.getOrders()).orElse(Collections.emptyList())
注意map是可以叠加的,相当于:
User user = .....
if(user != null) {
String name = user.getUsername();
if(name != null) {
return name.toUpperCase();
} else {
return null;
}
} else {
return null;
}