工作中经常会调外部接口、或者查询表等,如果对返回结果不进行空指针判断的话就会导致空指针异常。针对这种情况经常会使用if进行判断,比如示例一这样:
示例一:
private boolean isNotNull(Object param) {
if (param == null) {
return false;
} else {
return true;
}
}
这还仅仅是针对某个对象进行判空操作,如果我们需要对某个对象的某个具体参数使用,使用前需要对这个参数进行判空操作,那么我们应该怎么做呢?可能就会像示例二这样:
示例二:
private Integer getStaffInternalInfo(Staff staff) throws Exception {
if (staff != null) {
String StaffInfo = staff.getInternalInfo();
if (staffInfo != null) {
if (staffInfo.startsWith("sh")) {
//有权限,实现接口功能
} else {
throw new Exception("没权限");
}
} else {
logger.warn("getStaffInternalInfo: Staff entity isn't null but internalInfo
is null");
}
} else {
logger.warn("getStaffInternalInfo: input Staff entity is null !");
}
return null;
}
这样写其实功能上没有任何问题,但是如果像示例二这样需要判断的字段比较多,或者本身已经嵌套了多重循环或者判断,再加上这一层判断,代码就会变得非常臃肿,可读性非常差。
那么有没有更美观、更优雅的方式来解决这个问题呢?
jdk1.8提出了Optional方法来解决这个问题,先看看如何使用这个方法,示例一可以用Optional方法替代成以下语句:
private boolean isNotNull(Object param) {
return Optional.ofNullable(param).isPresent();
}
这样看起来就非常简洁,如果代码多的话将会省略一大堆眼花缭乱的括号。
仅仅了解这个方法如何使用是不够的,透过源码可以更好的掌握这类方法的使用技巧。
首先来看.ofNullable方法源码:
private static final Optional<?> EMPTY = new Optional<>();
private Optional() {
this.value = null;
}
//如果对象为空,执行empty();不为空,执行of(value)
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
//empty()方法调用静态变量EMPTY生成一个空对象(不是null)
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
//of()方法生成一个有值的对象
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
接下来看看最常用的.isPresent()方法和.orElse()方法源码
//orElse
public T orElse(T other) {
return value != null ? value : other;
}
//isPresent
public boolean isPresent() {
return value != null;
}
源码很简单,具体看看如何使用:
private boolean isNotNull(Object param) {
return Optional.ofNullable(param).isPresent();
}
private List<String> getInternalList(TestObject param) {
return Optional.ofNullable(param.getList()).orElse(Lists.newArrayList());
}