我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看

  发布时间:2025-11-04 04:12:40   作者:玩站小弟   我要评论
前言用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; } 

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

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); } 

所以回到这段程序:

// 根对象为空就创建一个空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 都会走一遍?在这种情况下会不会影响性能?编译器是否会作优化?这个暂不可知。云南idc服务商

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

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

总结

很多人一直都在说有在学习 Java 8 新特性,但在我看来,大部分人并没有什么实践,用的都还是最原始的实现方式。

其实我个人是一直在努力学习这方面的知识的,最新的我已经学到 Java 14 了,之前也陆续分享了一系列新特性文章。

所以我现在虽然是个老前浪了,但在新知识学习和掌握上面,我感觉已经走到了很多后浪前面。

  • Tag:

相关文章

  • 电脑玉雕创作教程(掌握玉雕电脑雕刻技术的关键步骤)

    摘要:玉雕作为我国传统工艺的瑰宝之一,如今在电脑技术的辅助下,玉雕电脑雕刻成为了一门精细而高效的艺术形式。本文将以连做教程为主题,介绍玉雕连做到电脑雕刻的关键步骤与技巧,帮助读者掌握这一...
    2025-11-04
  • Sql Server "用户登录失败,错误编号18456"的解决过程

    Sql Server 解决“用户登录失败,错误编号18456”1.说明因密码或用户名错误而使身份验证失败并导致连接尝试被拒时,类似以下内容的消息将返回到客户端:“用户‘<user_name>
    2025-11-04
  • 域名注册成功后怎么使用网站?

    在互联网时代,拥有一个专属的域名意味着在数字世界中拥有了自己的一席之地。域名注册成功后,如何有效利用这一资源,构建并运营一个成功的网站,成为许多域名所有者关心的问题。本文将为您提供一些实用的建议和步骤
    2025-11-04
  • 关于结构体中指针的一些探讨

    01 起因在上篇文章《STM32编程中枚举和结构体的结合》中,有读者对下列代码有疑问typedefstruct{char*name;//姓名intnum;//学号intage;//年龄floatsco
    2025-11-04
  • 福克斯特电脑使用教程(轻松掌握福克斯特电脑操作技巧)

    摘要:现代科技的飞速发展使得电脑已经成为人们生活中必不可少的一部分。然而,对于一些刚接触福克斯特电脑的用户来说,可能会感到迷茫和困惑。本文将为大家提供福克斯特电脑使用教程,帮助大家轻松掌...
    2025-11-04
  • 记一次 .NET 某药品仓储管理系统 卡死分析

    一:背景1. 讲故事这个月初,有位朋友wx上找到我,说他的api过一段时间后,就会出现只有请求,没有响应的情况,截图如下:从朋友的描述中看样子程序是被什么东西卡住了,这种卡死的问题解决起来相对简单,接
    2025-11-04

最新评论