Lambda在Java開發(fā)中的實(shí)際運(yùn)用經(jīng)驗(yàn)分享
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):
- public WechatResponseEntity<ObjectNode> appPay(PayParams payParams) {
- // Consumer 如果要拿到結(jié)果返回只能通過這種方式消費(fèi) 有點(diǎn)類似 setter
- WechatResponseEntity<ObjectNode> wechatResponseEntity = new WechatResponseEntity<>();
- this.client().withType(WechatPayV3Type.NATIVE, payParams)
- //BiFunction 用來組織參數(shù)
- .function(this::payFunction)
- //TODO 這里可以增加一個Supplier 來指定請求的客戶端
- //Consumer 用來消費(fèi)結(jié)果
- .consumer(wechatResponseEntity::convert)
- //執(zhí)行請求
- .request();
- 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抽象:
- INPUT -> OUTPUT
數(shù)學(xué)上為:
對應(yīng)Java中的Lambda函數(shù)是Function<INPUT>。
但是在實(shí)際開發(fā)中需要根據(jù)接口的具體情況做不同的處理,需要引入包含請求方法(上圖中的POST)和接口端點(diǎn),記作TYPE,高中我們講過函數(shù)替代法,我覺得這里可以用一用:
如果我們令 :
很容易推導(dǎo)出:
- (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中的
- @FunctionalInterface
- public interface Supplier<T> {
- /**
- * Gets a result.
- *
- * @return a result
- */
- T get();
- }
Lambda式子為:
- () -> T
不過目前Payment Spring Boot對于調(diào)用層還沒有抽象的打算,如果考慮到抽象一定會用Supplier
消費(fèi)結(jié)果
最終我們都需要對調(diào)用獲取的結(jié)果進(jìn)行消費(fèi),宏觀上只能消費(fèi)一次。對應(yīng)的Lambda式子:
- (T) -> {}
對T進(jìn)行消費(fèi)是沒有返回值的。就像吃一個蘋果,吃完之后是不會立即有產(chǎn)物的,否則你要趕緊吃點(diǎn) 💊。
Java中提供了Consumer
但是在Payment Spring Boot中對請求結(jié)果是需要返回給調(diào)用端的,也就是需要返回值的,當(dāng)時我考慮了很久,在Function
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)小胖哥公眾號。