我们有个对象需要对里面的errmsg和PhoneInfo里面的属性的字段进行判空
GetUserPhoneNumberResDto:
@Data
public class GetUserPhoneNumberResDto implements Serializable {
private static final long serialVersionUID = -1465870418687241991L;
/*
用户手机号信息
*/
private PhoneInfo phone_info;
/*
* 错误码
*/
private Integer errcode;
/*
* 错误信息
*/
private String errmsg;
public Optional<PhoneInfo> getPhoneInfoOfNull(){
return Optional.ofNullable(this.phone_info);
}
}
PhoneInfo:
@Data
public class PhoneInfo implements Serializable {
private static final long serialVersionUID = 6699668200460532864L;
/*
* 用户绑定的手机号(国外手机号会有区号)
*/
private String phoneNumber;
/*
* 没有区号的手机号
*/
private String purePhoneNumber;
/*
* 区号
*/
private String countryCode;
}
直接上代码:
// 对该对象的字段判空
String msg;
if(!ObjectUtils.isEmpty(getUserPhoneNumberResDto) && StringUtils.isNotEmpty(getUserPhoneNumberResDto.getErrmsg())){
msg = getUserPhoneNumberResDto.getErrmsg();
} else {
msg = null;
}
String msg = Optional.ofNullable(getUserPhoneNumberResDto).map(GetUserPhoneNumberResDto::getErrmsg).orElse(null);
// 对该对象属性的对象中的字段判空
String phone;
if (!ObjectUtils.isEmpty(getUserPhoneNumberResDto) &&
!ObjectUtils.isEmpty(getUserPhoneNumberResDto.getPhone_info()) &&
StringUtils.isNotEmpty(getUserPhoneNumberResDto.getPhone_info().getPurePhoneNumber())){
phone = getUserPhoneNumberResDto.getPhone_info().getPurePhoneNumber();
} else {
phone = null;
}
String phone = Optional.ofNullable(getUserPhoneNumberResDto).flatMap(GetUserPhoneNumberResDto::getPhoneInfoOfNull)
.map(PhoneInfo::getPurePhoneNumber)
.orElse(null);
我们注意到利用Optional里面主要运用到flatMap、ofNullable、map、orElse这四个方法,点进去看源码
首先先看看Optional是个什么东西
一个容器对象,可能包含也可能不包含非空值。如果存在值, isPresent()将返回true ,而get()将返回该值。
提供了依赖于包含值是否存在的其他方法,例如orElse() (如果值不存在则返回默认值)和ifPresent() (如果值存在则执行代码块)。
这是一个基于值的类;在Optional的实例上使用身份敏感操作(包括引用相等 ( == )、身份哈希码或同步)可能会产生不可预知的结果,应该避免。
ofNullable:
/**
返回一个描述指定值的Optional ,如果非 null ,否则返回一个空Optional 。
参数:
value -- 要描述的可能为 null 的值
回报:
如果指定值为非空,则为具有当前值的Optional ,否则为空Optional
*/
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
map:
/**
如果存在值,则对其应用提供的映射函数,如果结果为非 null,则返回描述结果的Optional 。否则返回一个空的Optional 。
参数:
mapper – 应用于值的映射函数(如果存在)
回报:
Optional描述将映射函数应用于此Optional的值的结果,如果存在值,否则为空Optional
抛出:
NullPointerException – 如果映射函数为 null
API 注释:
此方法支持对可选值进行后处理,无需显式检查返回状态。例如,以下代码遍历文件名流,选择一个尚未处理的文件,然后打开该文件,返回一个Optional :
Optional<FileInputStream> fis = names.stream().filter(name -> !isProcessedYet(name)) .findFirst() .map(name -> new FileInputStream(name));
在这里, findFirst返回一个Optional , 然后map返回一个Optional 如果存在所需的文件。
*/
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
flatMap:
/**
如果存在值,则将提供的Optional轴承映射函数应用于它,返回该结果,否则返回空Optional 。此方法类似于map(Function) ,但提供的映射器的结果已经是Optional ,如果被调用, flatMap不会用附加的Optional包装它。
参数:
mapper – 应用于值的映射函数,如果存在映射函数
回报:
如果存在值,则将Optional轴承映射函数应用于此Optional的值的结果,否则为空Optional
抛出:
NullPointerException – 如果映射函数为 null 或返回 null 结果
*/
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));
}
}
orElse:
/**
如果存在则返回值,否则返回other 。
参数:
other – 如果不存在值,则返回的值,可以为 null
回报:
该值(如果存在),否则为other
*/
public T orElse(T other) {
return value != null ? value : other;
}