Java妙手判空之Optional

我们有个对象需要对里面的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;
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值