Java8提供了一个Optional
类,它可以看作一个返回值的“容器”,用于更好的表达某个值存在或不存在。Optional
类常用于优化空指针处理的代码逻辑。
假设我们有如下这样一段代码逻辑,我们在repository
中调用queryComponentByName()
方法来查询一个组件,如果查到返回组件对象,查不到则返回null
。接下来我们要调用组件的execute()
方法,如果上一步没有查到组件,则创建一个默认组件并调用其中的方法。
package com.gacfox.demo;
public class Main {
public static void main(String[] args) {
MyRepository repository = new MyRepository();
Component component = repository.queryComponentByName("DemoComponent");
if (component != null) {
component.execute();
} else {
Component defaultComponent = new DefaultComponent();
defaultComponent.execute();
}
}
}
显然,在第二步中我们要用if (component != null) { ... }
进行判断,然后进行对应处理,还是比较麻烦的,使用Optional
能够简化这一逻辑。
MyRepository.java
package com.gacfox.demo;
import java.util.Optional;
public class MyRepository {
public Optional<Component> queryComponentByName(String name) {
// 具体查询逻辑 ...
return Optional.ofNullable(component);
}
}
Main.java
package com.gacfox.demo;
import java.util.Optional;
public class Main {
public static void main(String[] args) {
MyRepository repository = new MyRepository();
Optional<Component> component = repository.queryComponentByName("DemoComponent");
component.orElse(new DefaultComponent()).execute();
}
}
代码中,我们的MyRepository
没有直接返回Component
对象,而是使用Optional
类进行了一步封装。Main.java
中取用时,使用了Optional
的orElse
方法,它封装了如果Optional
对象内部为空时就使用参数传入的默认对象的逻辑,简化了代码的编写。
方法 | 说明 |
---|---|
Optional.of(T t) | 创建包含对象的Optional 实例,t 不可为null |
Optional.empty() | 创建空的Optional 实例 |
Optional.ofNullable(T t) | 若t 不为null ,创建包含t 的Optional 实例,否则创建空实例(常用) |
optional.isPresent() | 判断Optional 对象中是否包含值 |
optional.orElse(T t) | Optional 对象中包含值时返回该值,否则返回t |