Java中的Optional类

200 阅读1分钟

作用:解决空指针异常(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:空值