作用:解决空指针异常(NullPointerException)
如下代码:
String code =
user.getAddress().getCountry().getCode().toUpperCase()每一步都可能报NullPointerException
jdk8之前要判断每一步是否为null:
if (null != user) { Address address = user.getAddress(); if (null != address) { Country country = address.getCountry(); if (null != country) { String code = country.getCode(); if (null != code) { code.toUpperCase(); } } }}使用optional方法简化代码:
optional.map(User::getAddress).map(Address::getCountry) .map(Country::getCode).orElse("code");方法介绍
- 创建optional方法:
of 创建时,如果传值为null,则抛出异常ofNullable 创建时,如果传值为null,则创建一个空的optional
例:Optional<User> optional = Optional.OfNullable(user);- 过滤方法:
filter:依条件过滤对象,其返回值为原始对象
Optional<User> user = optional.filter(c -> c.getAge().equals(1));
map:过滤出的结果为null,不会抛出异常
Optional<Address> address = optional.map(User::getAddress);flatMap:过滤出的结果为null,抛出异常
Optional<Country> country = address.map(Address::getCountry);- 如果为null,设置默认值:
orElse:为null,则返回默认值
orElseGet:为null,则返回默认值
orElseThrow:为null,则抛出异常- 判断是否有值:
isPresent:判断optional是否为null- 取值:
get:获取optional中的对象- 为null,则不调用:
isPresent:判断optional是否为null
public static void main(String[] args) {
User user = new User();
Optional<User> optional = Optional.ofNullable(user);
optional.ifPresent(User::getAddress);
}
private static void print(Address address) {
System.out.println(address.getCountry());
}- 空值:
empty:空值