Lambda在Java開發中的實際運用經驗分享
1. 前言
Payment Spring Boot 1.0.4.RELEASE已經發布,在項目的推廣上也有了起色,越來越多的開發者開始嘗試這個新東西。今天胖哥來分享一下這個項目中Lambda的使用心得,希望對你的學習和工作有所幫助。
2. 看清本質
無論面對任何事,我們都要盡可能的看清其本質。
這句話不是什么名人大家說的,而是我中學的數學老師。他告訴我遇到數學題,不要立即埋頭去做,先要分析這道題所涉及的知識點,這樣才能快速領會這道題的立意。讓我受用至今。
編程也是一樣,遇到一個需求,先分析流程,把整個流程抽象化,然后再去填充細節。
就封裝微信支付來說,不!封裝第三方調用來說。一定是下面的流程:
第三方調用的本質
流程的抽象是我們解決問題的大前提。有了流程我們就能用代碼進行抽象了。根據流程下面是 App 支付的一個實現:
- public WechatResponseEntity<ObjectNode> appPay(PayParams payParams) {
- // Consumer 如果要拿到結果返回只能通過這種方式消費 有點類似 setter
- WechatResponseEntity<ObjectNode> wechatResponseEntity = new WechatResponseEntity<>();
- this.client().withType(WechatPayV3Type.NATIVE, payParams)
- //BiFunction 用來組織參數
- .function(this::payFunction)
- //TODO 這里可以增加一個Supplier 來指定請求的客戶端
- //Consumer 用來消費結果
- .consumer(wechatResponseEntity::convert)
- //執行請求
- .request();
- return wechatResponseEntity;
- }
包含了兩個Lambda,通過注釋我們能夠非常明確地知道流程是怎么樣的。
3. Lambda 的實踐
接著我們就可以根據上面的流程來進行深入了解細節了。看看如何在實際業務流程中來運用Lambda。
組織參數
組織參數目的就是為了第三方接口的調用,而且都要符合第三方 API 的要求。拿微信支付 APP 支付接口來舉個例子,它的請求報文大致是這樣的:
微信支付APP支付請求報文
如果我們記我們封裝后調用的入參為INPUT,將INPUT按照上述接口進行組織滿足微信 APP 支付接口的參數為OUTPUT。那么它們的轉換關系其實就是下面的一個Lambda抽象:
- INPUT -> OUTPUT
數學上為:
對應Java中的Lambda函數是Function<INPUT>。
但是在實際開發中需要根據接口的具體情況做不同的處理,需要引入包含請求方法(上圖中的POST)和接口端點,記作TYPE,高中我們講過函數替代法,我覺得這里可以用一用:
如果我們令 :
很容易推導出:
- (TYPE,INPUT) -> OUTPUT
對應Java中的Lambda函數是BiFunction
調用第三方接口
在Java開發中,無論你選擇的請求方式是Spring Framework提供的RestTemplate或者反應式客戶端WebClient,或者OKHttp都可以很方便地調用 Http 接口。也可以抽象,不管你用什么方法都是提供了一個調用工具,我們要拿工具來用就要get,因此非常適合Java中的
- @FunctionalInterface
- public interface Supplier<T> {
- /**
- * Gets a result.
- *
- * @return a result
- */
- T get();
- }
Lambda式子為:
- () -> T
不過目前Payment Spring Boot對于調用層還沒有抽象的打算,如果考慮到抽象一定會用Supplier
消費結果
最終我們都需要對調用獲取的結果進行消費,宏觀上只能消費一次。對應的Lambda式子:
- (T) -> {}
對T進行消費是沒有返回值的。就像吃一個蘋果,吃完之后是不會立即有產物的,否則你要趕緊吃點 💊。
Java中提供了Consumer
但是在Payment Spring Boot中對請求結果是需要返回給調用端的,也就是需要返回值的,當時我考慮了很久,在Function
4. 總結
Payment Spring Boot項目目前已經建立了一個良好的迭代機制,通過今天的分享,希望能幫助你看透項目中的一些需求的本質,抽象它們,找出它們的串聯關系。好了今天的分享就到這里,我是:碼農小胖哥,多多關注,分享日常開發中的點點滴滴。
Payment Spring Boot: https://github.com/NotFound403/payment-spring-boot
本文轉載自微信公眾號「 碼農小胖哥」,可以通過以下二維碼關注。轉載本文請聯系 碼農小胖哥公眾號。