偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看

開發(fā) 后端
用Java 8 寫了一段邏輯,同事居然說看不懂,以下是業(yè)務背景,大家可以一起看看!

前言

用Java 8 寫了一段邏輯,同事居然說看不懂,以下是業(yè)務背景,大家可以一起看看!

[[340793]]

業(yè)務背景

首先,業(yè)務需求是這樣的,從第三方電商平臺拉取所有訂單,然后保存到公司自己的數(shù)據(jù)庫,需要判斷是否有物流信息,如果有物流信息,還需要再進行上傳。

而第三方接口返回的數(shù)據(jù)是 JSON 格式的,其中物流信息卻藏的十分深,如下面所示,JSON 節(jié)點是這樣的:

  1. xxxOrder > xxxShippingInfo > xxxShipmentDetails > xxxTrackingInfo > trackingNumber, trackingLink 

基本實現(xiàn)

因為第三方接口返回的數(shù)據(jù)是 JSON 格式的,所以需要把 JSON 字符串轉(zhuǎn)換成 Java 對象來進行處理。

  1. @JsonIgnoreProperties(ignoreUnknown = true
  2. public class XxxOrder { 
  3.     /** 
  4.      * 物流信息 
  5.      */ 
  6.     @JsonProperty("shippingInfo"
  7.     private XxxShippingInfo xxxShippingInfo; 

上面只是第一層示例,要拿到物流信息,要依次封裝四層對象,到真正獲取物流信息時要避免空指針,就需要判斷四層才能拿到,如示例所示:

  1. if(xxxOrder != null){ 
  2.     if(xxxOrder.getXxxShippingInfo() != null){ 
  3.         if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails() != null){ 
  4.             if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails().getXxxTrackingInfo() != null){ 
  5.                 ... 
  6.             } 
  7.         } 
  8.     } 

獲取一個物流信息這么麻煩,我也是醉了,這樣寫也太不優(yōu)雅了。

Java 8 實現(xiàn)

因為我知道 Java 8 可以處理這類的需求,所以我從來沒想過用最原始的方式去實現(xiàn),直接把就用 Java 8 來實現(xiàn)了:

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

寫完之后,同事居然都直呼看不懂,還特地跑過來問我。。

實現(xiàn)原理

其實這并沒有用什么高超的技術(shù),就是利用 Java 8 Optional 來實現(xiàn)的,細節(jié)就不介紹了 ,主要是為了避免空指針而生的,不懂的可以點擊這里查看這篇文章。

今天就來介紹下 Optional#map 方法實現(xiàn)這段邏輯的原理,來看下 map 的實現(xiàn)源碼:

  1. public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { 
  2.     // 函數(shù)式接口不能為null 
  3.     Objects.requireNonNull(mapper);    // 如果當前沒有值,返回一個空的Optional 
  4.     if (!isPresent()) 
  5.         return empty(); 
  6.     else { 
  7.         // 如果當前有值,返回一個函數(shù)式處理該值的結(jié)果Optional 
  8.         return Optional.ofNullable(mapper.apply(value)); 
  9.     }}// 判斷 Optional Value 有沒有值 
  10. public boolean isPresent() {    return value != null
  11. }// 創(chuàng)建一個 Optional,可以為空 
  12. public static <T> Optional<T> ofNullable(T value) {    return value == null ? empty() : of(value); 

所以回到這段程序:

  1. // 根對象為空就創(chuàng)建一個空Optional,否則就創(chuàng)建一個根對象的Optional 
  2. Optional.ofNullable(xxxOrder)    // 根對象為空就直接返回空Optional,否則返回這個值的 Optional 
  3.     .map((o) -> o.getXxxShippingInfo()) 
  4.     // 下面依次類推…… 
  5.     .map((si) -> si.getXxxShipmentDetails()) 
  6.     .map((sd) -> sd.getXxxTrackingInfo()) 
  7.     .map((t) -> new String[]{t.getTrackingNumber(), t.getTrackingLink()}) 
  8.     // 取不到值就返回 null 
  9.     .orElse(null); 

也許你看完感覺還是看不懂,我承認,確實比較繞,不太好理解,這個只可意會不可言傳了,多看多練就理解了。

這個的關(guān)鍵核心在于,調(diào)用 map 時,如果 Optional 沒有值就直接返回空的 Optional,而不會調(diào)用函數(shù)式接口,所以就不會出現(xiàn)空指針。所以只要有一個為空,后面就取不到物流信息。

程序使用了 .xx.xx.xx 這樣的鏈式調(diào)用,調(diào)用 map 方法就必須是 Optional,而 map 的返回結(jié)果就是 Optional。

有一個問題是,如果都為空,那不是所有的 map 都會走一遍?在這種情況下會不會影響性能?編譯器是否會作優(yōu)化?這個暫不可知。

另外還有一個 flatMap 方法,和 map 有什么區(qū)別呢?

flatMap 返回結(jié)果需要在函數(shù)式接口中封裝 Optional 返回,在這里應用不太合適。

總結(jié)

很多人一直都在說有在學習 Java 8 新特性,但在我看來,大部分人并沒有什么實踐,用的都還是最原始的實現(xiàn)方式。

其實我個人是一直在努力學習這方面的知識的,最新的我已經(jīng)學到 Java 14 了,之前也陸續(xù)分享了一系列新特性文章。

所以我現(xiàn)在雖然是個老前浪了,但在新知識學習和掌握上面,我感覺已經(jīng)走到了很多后浪前面。

責任編輯:未麗燕 來源: Java技術(shù)棧
相關(guān)推薦

2023-12-30 08:16:34

Django權(quán)限控制

2022-06-16 14:07:26

Java代碼代碼review

2020-03-30 16:45:06

代碼看不懂

2020-03-06 11:30:08

JavaGitHub編程

2019-12-09 08:29:26

Netty架構(gòu)系統(tǒng)

2022-01-05 09:40:03

DIff算法前端

2019-11-18 14:45:13

代碼開發(fā)工具

2016-12-16 12:32:50

阿里數(shù)據(jù)分析職業(yè)要求

2022-12-12 07:40:36

服務器項目Serverless

2018-04-12 10:02:57

大數(shù)據(jù)領(lǐng)域工具

2022-07-26 14:38:08

JavaScriptWeb安全自動化

2023-06-30 08:01:04

Reactuse關(guān)鍵詞

2021-02-04 07:55:28

代碼離職互聯(lián)網(wǎng)

2021-12-09 11:59:49

JavaScript前端提案

2020-04-07 12:13:15

Python數(shù)據(jù)爬蟲

2021-10-08 08:58:35

物聯(lián)網(wǎng)通信發(fā)布者

2019-10-18 09:39:44

爬蟲消息大數(shù)據(jù)

2019-10-14 09:51:08

爬蟲網(wǎng)絡(luò)系統(tǒng)

2025-07-04 02:00:00

2021-02-23 10:36:09

Linux命令kmdr
點贊
收藏

51CTO技術(shù)棧公眾號