在写代码时,调用了一个方法、三方接口或者反序列化一个对象时,基于不信任原则,对获得的对象进行非空判断是一个程序员最基本的编程素养。
先看一段演示代码,连环夺命if判断(该代码只是为了演示效果,过于简单,实际中也不乏与之类似的代码)
或许你早起习惯了这种写法,都没有想过使代码变得更加优雅,如下图这般
代码是不是很简洁,如果你想了解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<User> 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<User> optional = optional.map(user -> user.toString());
以上代码等价于
public Optional<String> 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<User> optional1 = option.filter(u -> u.getAge() > 18);
以上代码等价于
public Optional<User> testFileter(Optional<User> 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处理非空判断时的优雅,写代码也能成为一种艺术
扫码关注我的公众号
每天进步一点点,不负光阴,度几扶人