成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

前言

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

[[340793]]

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

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

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

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

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

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

  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 實(shí)現(xià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)前沒有值,返回一個空的Optional 
  4.     if (!isPresent()) 
  5.         return empty(); 
  6.     else { 
  7.         // 如果當(dāng)前有值,返回一個函數(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); 

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

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

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

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

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

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

總結(jié)

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

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

所以我現(xiàn)在雖然是個老前浪了,但在新知識學(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)

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

服務(wù)器項目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
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 91性高湖久久久久久久久_久久99 | 日韩精品专区在线影院重磅 | 久久av网 | 午夜激情影院 | 久久精品欧美一区二区三区不卡 | 在线观看特色大片免费网站 | 中文字幕国产日韩 | 午夜一级黄色片 | 狠狠色网| 久久久久久久久久久久久9999 | 久久久久久成人 | 97人澡人人添人人爽欧美 | 在线视频一区二区 | 丝袜美腿一区二区三区 | 福利片在线| 国内精品在线视频 | 日韩欧美一区二区三区免费看 | 国产精品成人一区二区 | 天天操操 | 中文字幕国产 | 久久久久久久夜 | 美国一级片在线观看 | 天天射视频 | 超碰成人av | 亚洲国产一区在线 | 日韩在线视频播放 | 中文字幕一区二区三区四区 | 国产精品美女久久久久aⅴ国产馆 | 日本精品网站 | 国产一区二区视频在线 | 亚洲国产精品人人爽夜夜爽 | 欧美在线国产精品 | 国产精品欧美一区二区 | 国产一区| 一区二区三区在线播放视频 | 国产亚洲精品精品国产亚洲综合 | 一区二区在线免费观看视频 | 日日操网站 | 在线欧美视频 | 一区二区三区影院 | 国产欧美一级 |