optional用法_java8的新特性之optional

optional用法_java8的新特性之optional_第1张图片

在写代码时,调用了一个方法、三方接口或者反序列化一个对象时,基于不信任原则,对获得的对象进行非空判断是一个程序员最基本的编程素养。

先看一段演示代码,连环夺命if判断(该代码只是为了演示效果,过于简单,实际中也不乏与之类似的代码)

optional用法_java8的新特性之optional_第2张图片

或许你早起习惯了这种写法,都没有想过使代码变得更加优雅,如下图这般

optional用法_java8的新特性之optional_第3张图片

代码是不是很简洁,如果你想了解optional的具体用法,请继续往下看。下文会详细介绍optional的常用方法,每个方法都会有对应的demo

optional类中的构造方法是私有的,所以无法通过new的方式创建对象,只能通过以下三种方式创建

/**
 * 该方式创建一个空的optional,调用optional.get()方法时会返回null值
 */
Optional optional1 = Optional.empty();
​
/**
 * 该方式创建的optional如果value为null,会抛出空指针异常
 * 如:Optional.of(UserDao.get()),如果UserDao.get()=null,则会抛出空指针
 */
Optional optional2 = Optional.of(value);
​
/**
 * 该方式创建的optional,如果value为空则返回一个空的optional,不会抛出空指针
 */
Optional optional3 = Optional.ofNullable(value);

get方法可以获取value,也就是泛型中的对象

Optional optional = Optional.ofNullable(new User());
User user = optional.get();

isPresent方法判断value不为空

if (optional.isPresent()) {
    System.out.println("user对象不为空");
}

ifPresent方法表示在value不为空时做一些别的操作

optional.ifPresent(user -> {
    int age = user.getAge();
    System.out.println("获得的age=" + age)
})

以上代码等价于

if (optional.isPresent()) {
    int age = user.getAge();
    System.out.println("获得的age=" + age)
}

map方法允许你直接对value进行操作,并且不会报空指针,同时返回一个新的optional

Optional optional = optional.map(user -> user.toString());

以上代码等价于

public Optional testMap(User user) {
  Optional optional = Optional.of(user);
  if (!optional.isPresent())
    return Optional.empty();
  else {
    return Optional.ofNullable(user.toString());
  }
}

filter可以进行过滤,满足条件时返回该optional,不满足条件时返回empty,需要注意的是如果optional为null是不会触发过滤条件的

Optional optional1 = option.filter(u -> u.getAge() > 18);

以上代码等价于

public Optional testFileter(Optional optional) {
  User user = optional.get();
  if (user == null) {
     return optional;
   } else {
     return user.getAge()>18 ? optional : Optional.empty();
   }
 }

orElse方法允许在value为null时设置一个默认值

User user = optional.orElse(new User());

以上代码等价于

if(value == null){
  return new User();
} else {
  return value;
}

orElseGet方法允许你在value为null做一系列操作,并返回一个新的value

User user = optional.orElseGet(() -> {
  User u = new User();
  u.setAge(18);
  return u;
});

以上代码等价于

public User testOrElseGet(User user) {
  if (user != null) {
        return user;
    } else {
      User u = new User();
      u.setAge(18);
      return u;
    } 
}

orElseThrow方法在value为空时抛出异常

User user = optional.orElseThrow(() -> new RuntimeException());

以上代码等价于

public User testOrElseThrow(User user) throws Exception {
  if (user != null) {
    return user;
  }
  throw new RuntimeException();
}

通过各种等价的对比,更能体现optional处理非空判断时的优雅,写代码也能成为一种艺术


扫码关注我的公众号

每天进步一点点,不负光阴,度几扶人

optional用法_java8的新特性之optional_第4张图片

你可能感兴趣的:(optional用法)