您现在的位置是:亿华云 > 人工智能
我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看
亿华云2025-10-02 09:03:41【人工智能】8人已围观
简介前言用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); }所以回到这段程序:
// 根对象为空就创建一个空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 有什么区别呢?
flatMap 返回结果需要在函数式接口中封装 Optional 返回,在这里应用不太合适。
总结
很多人一直都在说有在学习 Java 8 新特性,但在我看来,大部分人并没有什么实践,用的都还是最原始的实现方式。
其实我个人是一直在努力学习这方面的知识的,最新的我已经学到 Java 14 了,之前也陆续分享了一系列新特性文章。
所以我现在虽然是个老前浪了,但在新知识学习和掌握上面,我感觉已经走到了很多后浪前面。
很赞哦!(92565)
相关文章
- IBM推出高能效NorthPole机器学习处理器
- 什么是im域名?新手需要了解im域名哪些?
- 4.域名的整体品牌营销力
- 4.域名的整体品牌营销力
- CentOS下搭建Gitea-自己的Git服务器
- 前面这两个步骤都是在本机完成的。到这里还没有涉及真正的域名解析服务器,如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名了。
- 旧域名的外链是否会对新建站点产生影响?
- 2、根据用户基础选择访问提供程序。由于互联问题的存在,接入商的选择也非常重要,如果用户群主要在联通,尽量选择联通接入较好的接入商,如果用户群主要在电信,那么选择电信接入较好的接入商。如果用户组位于国家/地区,则选择更好的访问提供程序进行交互。
- 携程机票前台Trace系统的演进之路
- 为了避免将来给我们的个人站长带来的麻烦,在选择域名后缀时,我们的站长最好省略不稳定的后缀域名,比如n,因为我们不知道策略什么时候会改变,更不用说我们将来是否还能控制这个域名了。因此,如果站长不是企业,或者有选择的话,如果不能选择域名的cn类,最好不要选择它。
热门文章
站长推荐
AI根技术如何助力产业发展?昇思生态城市行·广州活动给你答案
域后缀首选.com,.net,然后是.cn。后缀选择不当,导致流量损失。域名是企业与互联网网址之间的链接,关键是企业在网络上存在的标志。因此,选择好域名是开展网上工作的首要重要条件。
以上的就是为大家介绍的关于域名的详解
便宜域名使用如何?小白可以买到便宜域名吗?
直接芯片冷却:数据中心运营商应该了解的一切
旧域名的外链是否会对新建站点产生影响?
2、根据用户基础选择访问提供程序。由于互联问题的存在,接入商的选择也非常重要,如果用户群主要在联通,尽量选择联通接入较好的接入商,如果用户群主要在电信,那么选择电信接入较好的接入商。如果用户组位于国家/地区,则选择更好的访问提供程序进行交互。
小白注册网站域名该怎么办?有什么步骤?