Optional可以优雅的处理NPE(空指针)问题
获取Optional对象
- empty()
// 返回一个空的Optional对象
Optional<Customer> empty = Optional.empty();
- of(T value),创建一个不可为空的Optional
// 返回一个Optional对象,如果参数为空则抛NPE异常
Optional<Customer> customerOpt1 = Optional.of(customer);
- ofNullable(T value),创建一个可为空的Optional
// 返回一个Optional对象,如果参数为空则返回一个空对象
Optional<Customer> customerOpt2 = Optional.ofNullable(customer);
首先创建一个Customer类, 属性如下
public class Customer {
private String id;
private String name;
//get set 和 构造方法
@Override
public String toString() {
return "Customer{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
isPresent() 和 ifPresent()
isPresent(): 判断值是否存在
- Java7
if (customer != null) {
// doSomething
}
- Java8
if (customerOpt1.isPresent()) {
// doSomething
}
ifPresent(): 如果值存在则进行处理逻辑,否则跳过
- Java7
if (customer != null) {
if (customer.getId().length() == 1) {
System.out.println(customer.getName());
}
}
- Java8
customerOpt1.ifPresent(c -> {
if (c.getId().length() == 1) {
System.out.println(c.getName());
}
});
orEls & orElseGet & orElseThrow 区别
都是Optional为空的话进行相对的处理
- orElse: 值存在直接返回value,否则返回输入的other
// 源码
public T orElse(T other) {
return value != null ? value : other;
}
// 例子
Customer cus = new Customer();
cus.setId("123");
Customer customerElse = Optional.ofNullable(cus).orElse(new Customer("456", "Tom"));
System.out.println(customerElse);
// 输出
Customer{id='123', name='null'}
- orElseGet: 值存在直接返回value,否则执行输入的other
// 源码
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
// 例子
Customer cus = null;
Customer customerGet = Optional.ofNullable(cus).orElseGet(() -> new Customer("456","Keven"));
System.out.println(customerGet);
// 结果
Customer{id='456', name='Keven'}
- orElseThrow: 值存在直接返回value,否则抛出一个异常
// 源码
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
// 例子
Customer cus = null;
Customer customerElse = Optional.ofNullable(cus).orElseThrow(RuntimeException::new);
System.out.println(customerElse);
filter
可以过滤需要的值
Optional<Customer> cusOpt = customer1
.filter(c -> c.getId() != null && c.getName().length() > 2);
map
可以获取需要的值
String s = customer1
.map(c -> c.getName()).orElse("null value");