温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么用Java8写逻辑

发布时间:2021-11-30 13:57:33 来源:亿速云 阅读:151 作者:iii 栏目:大数据

本篇内容介绍了“怎么用Java8写逻辑”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

业务背景

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

而第三方接口返回的数据是 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 来实现了:

/**
* 公众号:Java技术栈
/
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);
}

所以回到这段程序:

// 根对象为空就创建一个空Optional,否则就创建一个根对象的Optional
Optional.ofNullable(xxxOrder)
    // 根对象为空就直接返回空Optional,否则返回这个值的 Optional
    .map((o) -> o.getXxxShippingInfo())
    // 下面依次类推……
    .map((si) -> si.getXxxShipmentDetails())
    .map((sd) -> sd.getXxxTrackingInfo())
    .map((t) -> new String[]{t.getTrackingNumber(), t.getTrackingLink()})
    // 取不到值就返回 null
    .orElse(null);
}

也许你看完感觉还是看不懂,我承认,确实比较绕,不太好理解,这个只可意会不可言传了,多看多练就理解了。

这个的关键核心在于,调用 map 时,如果 Optional 没有值就直接返回空的 Optional,而不会调用函数式接口,所以就不会出现空指针。所以只要有一个为空,后面就取不到物流信息。

程序使用了 .xx.xx.xx 这样的链式调用,调用 map 方法就必须是 Optional,而 map 的返回结果就是 Optional。

有一个问题是,如果都为空,那不是所有的 map 都会走一遍?在这种情况下会不会影响性能?编译器是否会作优化?这个暂不可知。

另外还有一个 flatMap 方法,和 map 有什么区别呢?

怎么用Java8写逻辑

flatMap 返回结果需要在函数式接口中封装 Optional 返回,在这里应用不太合适。

“怎么用Java8写逻辑”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI