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

Lambda在Java開發(fā)中的實(shí)際運(yùn)用經(jīng)驗(yàn)分享

開發(fā) 后端
Payment Spring Boot 1.0.4.RELEASE已經(jīng)發(fā)布,在項(xiàng)目的推廣上也有了起色,越來越多的開發(fā)者開始嘗試這個新東西。今天胖哥來分享一下這個項(xiàng)目中Lambda的使用心得,希望對你的學(xué)習(xí)和工作有所幫助。

[[377318]]

1. 前言

Payment Spring Boot 1.0.4.RELEASE已經(jīng)發(fā)布,在項(xiàng)目的推廣上也有了起色,越來越多的開發(fā)者開始嘗試這個新東西。今天胖哥來分享一下這個項(xiàng)目中Lambda的使用心得,希望對你的學(xué)習(xí)和工作有所幫助。

2. 看清本質(zhì)

無論面對任何事,我們都要盡可能的看清其本質(zhì)。

這句話不是什么名人大家說的,而是我中學(xué)的數(shù)學(xué)老師。他告訴我遇到數(shù)學(xué)題,不要立即埋頭去做,先要分析這道題所涉及的知識點(diǎn),這樣才能快速領(lǐng)會這道題的立意。讓我受用至今。

編程也是一樣,遇到一個需求,先分析流程,把整個流程抽象化,然后再去填充細(xì)節(jié)。

就封裝微信支付來說,不!封裝第三方調(diào)用來說。一定是下面的流程:

第三方調(diào)用的本質(zhì)

 

流程的抽象是我們解決問題的大前提。有了流程我們就能用代碼進(jìn)行抽象了。根據(jù)流程下面是 App 支付的一個實(shí)現(xiàn):

  1. public WechatResponseEntity<ObjectNode> appPay(PayParams payParams) { 
  2.     // Consumer 如果要拿到結(jié)果返回只能通過這種方式消費(fèi) 有點(diǎn)類似 setter 
  3.     WechatResponseEntity<ObjectNode> wechatResponseEntity = new WechatResponseEntity<>(); 
  4.     this.client().withType(WechatPayV3Type.NATIVE, payParams) 
  5.             //BiFunction 用來組織參數(shù) 
  6.             .function(this::payFunction) 
  7.             //TODO 這里可以增加一個Supplier 來指定請求的客戶端 
  8.             //Consumer 用來消費(fèi)結(jié)果 
  9.             .consumer(wechatResponseEntity::convert
  10.             //執(zhí)行請求 
  11.             .request(); 
  12.     return wechatResponseEntity; 

包含了兩個Lambda,通過注釋我們能夠非常明確地知道流程是怎么樣的。

3. Lambda 的實(shí)踐

接著我們就可以根據(jù)上面的流程來進(jìn)行深入了解細(xì)節(jié)了??纯慈绾卧趯?shí)際業(yè)務(wù)流程中來運(yùn)用Lambda。

組織參數(shù)

組織參數(shù)目的就是為了第三方接口的調(diào)用,而且都要符合第三方 API 的要求。拿微信支付 APP 支付接口來舉個例子,它的請求報(bào)文大致是這樣的:

微信支付APP支付請求報(bào)文

 

如果我們記我們封裝后調(diào)用的入?yún)镮NPUT,將INPUT按照上述接口進(jìn)行組織滿足微信 APP 支付接口的參數(shù)為OUTPUT。那么它們的轉(zhuǎn)換關(guān)系其實(shí)就是下面的一個Lambda抽象:

  1. INPUT -> OUTPUT 

數(shù)學(xué)上為:

對應(yīng)Java中的Lambda函數(shù)是Function<INPUT>。

但是在實(shí)際開發(fā)中需要根據(jù)接口的具體情況做不同的處理,需要引入包含請求方法(上圖中的POST)和接口端點(diǎn),記作TYPE,高中我們講過函數(shù)替代法,我覺得這里可以用一用:

如果我們令 :

很容易推導(dǎo)出:

  1. (TYPE,INPUT) -> OUTPUT 

對應(yīng)Java中的Lambda函數(shù)是BiFunction

調(diào)用第三方接口

在Java開發(fā)中,無論你選擇的請求方式是Spring Framework提供的RestTemplate或者反應(yīng)式客戶端WebClient,或者OKHttp都可以很方便地調(diào)用 Http 接口。也可以抽象,不管你用什么方法都是提供了一個調(diào)用工具,我們要拿工具來用就要get,因此非常適合Java中的

  1. @FunctionalInterface 
  2. public interface Supplier<T> { 
  3.  
  4.     /** 
  5.      * Gets a result. 
  6.      * 
  7.      * @return a result 
  8.      */ 
  9.     T get(); 

Lambda式子為:

  1. () -> T 

不過目前Payment Spring Boot對于調(diào)用層還沒有抽象的打算,如果考慮到抽象一定會用Supplier去實(shí)現(xiàn)。

消費(fèi)結(jié)果

最終我們都需要對調(diào)用獲取的結(jié)果進(jìn)行消費(fèi),宏觀上只能消費(fèi)一次。對應(yīng)的Lambda式子:

  1. (T) -> {} 

對T進(jìn)行消費(fèi)是沒有返回值的。就像吃一個蘋果,吃完之后是不會立即有產(chǎn)物的,否則你要趕緊吃點(diǎn) 💊。

Java中提供了Consumer接口來作為消費(fèi)的Lambda接口,非常容易理解。

但是在Payment Spring Boot中對請求結(jié)果是需要返回給調(diào)用端的,也就是需要返回值的,當(dāng)時我考慮了很久,在Function和Consumer之間,最終還是選擇了Consumer,或許就是它更接近消費(fèi)的本質(zhì)。

4. 總結(jié)

Payment Spring Boot項(xiàng)目目前已經(jīng)建立了一個良好的迭代機(jī)制,通過今天的分享,希望能幫助你看透項(xiàng)目中的一些需求的本質(zhì),抽象它們,找出它們的串聯(lián)關(guān)系。好了今天的分享就到這里,我是:碼農(nóng)小胖哥,多多關(guān)注,分享日常開發(fā)中的點(diǎn)點(diǎn)滴滴。

 

Payment Spring Boot: https://github.com/NotFound403/payment-spring-boot

本文轉(zhuǎn)載自微信公眾號「 碼農(nóng)小胖哥」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 碼農(nóng)小胖哥公眾號。

 

責(zé)任編輯:武曉燕 來源: 碼農(nóng)小胖哥
相關(guān)推薦

2009-08-07 10:00:00

在Eclipse中安裝

2023-08-29 07:42:21

離線數(shù)倉實(shí)時數(shù)倉

2018-11-06 10:51:07

Redis開發(fā)存儲系統(tǒng)

2011-07-05 18:23:23

java

2011-08-22 15:47:27

Oracle臨時表存儲過程

2010-01-07 15:29:59

VB.NET表達(dá)式

2011-06-14 09:27:43

高性能WEB開發(fā)

2011-07-07 10:49:41

JavaScript

2011-10-09 14:23:02

開發(fā)

2010-02-02 13:15:00

C++ lambda函

2010-08-10 11:04:19

部署SCOMWindows Ser

2025-01-15 07:00:00

Java代碼Lambda

2011-05-16 09:30:30

jQueryWCF

2010-01-14 18:14:22

VB.NET開發(fā)特點(diǎn)

2018-05-07 15:28:45

項(xiàng)目開發(fā)管理

2011-07-08 15:20:30

seamjsf

2010-08-20 13:45:43

DB2數(shù)據(jù)庫

2012-12-27 10:05:15

2013-04-28 13:52:05

app

2011-04-25 16:56:34

Greedy Bank游戲開發(fā)獨(dú)立開發(fā)者
點(diǎn)贊
收藏

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