自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

前言

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

[[340793]]

業(yè)務(wù)背景

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

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

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

基本實(shí)現(xiàn)

因?yàn)榈谌浇涌诜祷氐臄?shù)據(jù)是 JSON 格式的,所以需要把 JSON 字符串轉(zhuǎn)換成 Java 對(duì)象來進(jìn)行處理。

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

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

  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.     } 

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

Java 8 實(shí)現(xiàn)

因?yàn)槲抑?Java 8 可以處理這類的需求,所以我從來沒想過用最原始的方式去實(shí)現(xiàn),直接把就用 Java 8 來實(shí)現(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);} 

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

實(shí)現(xiàn)原理

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

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

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

所以回到這段程序:

  1. // 根對(duì)象為空就創(chuàng)建一個(gè)空Optional,否則就創(chuàng)建一個(gè)根對(duì)象的Optional 
  2. Optional.ofNullable(xxxOrder)    // 根對(duì)象為空就直接返回空Optional,否則返回這個(gè)值的 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); 

也許你看完感覺還是看不懂,我承認(rèn),確實(shí)比較繞,不太好理解,這個(gè)只可意會(huì)不可言傳了,多看多練就理解了。

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

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

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

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

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

總結(jié)

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

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

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

責(zé)任編輯:未麗燕 來源: 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)

2016-12-16 12:32:50

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

2022-01-05 09:40:03

DIff算法前端

2019-11-18 14:45:13

代碼開發(fā)工具

2022-12-12 07:40:36

服務(wù)器項(xiàng)目Serverless

2023-06-30 08:01:04

Reactuse關(guān)鍵詞

2022-07-26 14:38:08

JavaScriptWeb安全自動(dòng)化

2018-04-12 10:02:57

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

2021-02-04 07:55:28

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

2020-04-07 12:13:15

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

2021-12-09 11:59:49

JavaScript前端提案

2021-10-08 08:58:35

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

2019-10-14 09:51:08

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

2019-10-18 09:39:44

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

2020-03-02 00:01:25

Linux字符目錄

2022-02-07 09:05:00

GitHub功能AI
點(diǎn)贊
收藏

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