太厉害了!我用-Java-8-写了一段逻辑

用Java 8 写了一段逻辑,同事居然说看不懂,以下是业务背景,大家可以一起看看!

业务背景

首先,业务需求是这样的,从第三方电商平台拉取所有订单,然后保存到公司自己的数据库,需要判断是否有物流信息,如果有物流信息,还需要再进行上传。

而第三方接口返回的数据是 JSON 格式的,其中物流信息却藏的十分深,如下面所示,JSON 节点是这样的:

xxxOrder > xxxShippingInfo > xxxShipmentDetails > xxxTrackingInfo > trackingNumber, trackingLink

基本实现

因为第三方接口返回的数据是 JSON 格式的,所以需要把 JSON 字符串转换成 Java 对象来进行处理。

@JsonIgnoreProperties(ignoreUnknown = true)
public class XxxOrder {

    /**
     * 物流信息
     */
    @JsonProperty("shippingInfo")
    private XxxShippingInfo xxxShippingInfo;

}

上面只是第一层示例,要拿到物流信息,要依次封装四层对象,到真正获取物流信息时要避免空指针,就需要判断四层才能拿到,如示例所示:

if(xxxOrder != null){
	if(xxxOrder.getXxxShippingInfo() != null){
		if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails() != null){
			if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails().getXxxTrackingInfo() != null){
				...
			}
		}
	}
}

获取一个物流信息这么麻烦,我也是醉了,这样写也太不优雅了。

Java 8 实现

因为我知道 Java 8 可以处理这类的需求,所以我从来没想过用最原始的方式去实现,直接把就用 Java 8 来实现了:

/**
* 
/
private String[] getFulfillments(XxxOrder xxxOrder) {
    return Optional.ofNullable(xxxOrder)
            .map((o) -> o.getXxxShippingInfo())
            .map((si) -> si.getXxxShipmentDetails())
            .map((sd) -> sd.getXxxTrackingInfo())
            .map((t) -> new String[]{t.getTrackingNumber(), t.getTrackingLink()})
            .orElse(null);
}

写完之后,同事居然都直呼看不懂,还特地跑过来问我。。

实现原理

其实这并没有用什么高超的技术,就是利用 Java 8 Optional 来实现的,细节就不介绍了 ,主要是为了避免空指针而生的,不懂的可以点击这里查看这篇文章。

今天就来介绍下 Optional#map 方法实现这段逻辑的原理,来看下 map 的实现源码:

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    // 函数式接口不能为null
    Objects.requireNonNull(mapper);

    // 如果当前没有值,返回一个空的Optional
    if (!isPresent())
        return empty();
    else {
        // 如果当前有值,返回一个函数式处理该值的结果Optional
        return Optional.ofNullable(mapper.apply(value));
    }
}

// 判断 Optional Value 有没有值
public boolean isPresent() {
    return value != null;
}

// 创建一个 Optional,可以为空
public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}

所以回到这段程序:



### 最后

给大家送一个小福利

![](https://img-blog.csdnimg.cn/img_convert/58031cadf4a2194c51223083c9f1b164.png)

资料都是免费分享的,附送高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。**[点我免费领取](https://gitee.com/vip204888/java-p7)!!!**

![](https://img-blog.csdnimg.cn/img_convert/ec33e17b2f22b76ca9e289ad5520f21e.png)

自身职业规划迷茫的朋友们。**[点我免费领取](https://gitee.com/vip204888/java-p7)!!!**

[外链图片转存中...(img-vC9UVy46-1628148365714)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值