Lambda在Java开发中的实际运用经验分享

开发 后端
Payment Spring Boot 1.0.4.RELEASE已经发布,在项目的推广上也有了起色,越来越多的开发者开始尝试这个新东西。今天胖哥来分享一下这个项目中Lambda的使用心得,希望对你的学习和工作有所帮助。

[[377318]]

1. 前言

Payment Spring Boot 1.0.4.RELEASE已经发布,在项目的推广上也有了起色,越来越多的开发者开始尝试这个新东西。今天胖哥来分享一下这个项目中Lambda的使用心得,希望对你的学习和工作有所帮助。

2. 看清本质

无论面对任何事,我们都要尽可能的看清其本质。

这句话不是什么名人大家说的,而是我中学的数学老师。他告诉我遇到数学题,不要立即埋头去做,先要分析这道题所涉及的知识点,这样才能快速领会这道题的立意。让我受用至今。

编程也是一样,遇到一个需求,先分析流程,把整个流程抽象化,然后再去填充细节。

就封装微信支付来说,不!封装第三方调用来说。一定是下面的流程:

第三方调用的本质

 

流程的抽象是我们解决问题的大前提。有了流程我们就能用代码进行抽象了。根据流程下面是 App 支付的一个实现:

  1. public WechatResponseEntity<ObjectNode> appPay(PayParams payParams) { 
  2.     // Consumer 如果要拿到结果返回只能通过这种方式消费 有点类似 setter 
  3.     WechatResponseEntity<ObjectNode> wechatResponseEntity = new WechatResponseEntity<>(); 
  4.     this.client().withType(WechatPayV3Type.NATIVE, payParams) 
  5.             //BiFunction 用来组织参数 
  6.             .function(this::payFunction) 
  7.             //TODO 这里可以增加一个Supplier 来指定请求的客户端 
  8.             //Consumer 用来消费结果 
  9.             .consumer(wechatResponseEntity::convert
  10.             //执行请求 
  11.             .request(); 
  12.     return wechatResponseEntity; 

包含了两个Lambda,通过注释我们能够非常明确地知道流程是怎么样的。

3. Lambda 的实践

接着我们就可以根据上面的流程来进行深入了解细节了。看看如何在实际业务流程中来运用Lambda。

组织参数

组织参数目的就是为了第三方接口的调用,而且都要符合第三方 API 的要求。拿微信支付 APP 支付接口来举个例子,它的请求报文大致是这样的:

微信支付APP支付请求报文

 

如果我们记我们封装后调用的入参为INPUT,将INPUT按照上述接口进行组织满足微信 APP 支付接口的参数为OUTPUT。那么它们的转换关系其实就是下面的一个Lambda抽象:

  1. INPUT -> OUTPUT 

数学上为:

对应Java中的Lambda函数是Function<INPUT>。

但是在实际开发中需要根据接口的具体情况做不同的处理,需要引入包含请求方法(上图中的POST)和接口端点,记作TYPE,高中我们讲过函数替代法,我觉得这里可以用一用:

如果我们令 :

很容易推导出:

  1. (TYPE,INPUT) -> OUTPUT 

对应Java中的Lambda函数是BiFunction

调用第三方接口

在Java开发中,无论你选择的请求方式是Spring Framework提供的RestTemplate或者反应式客户端WebClient,或者OKHttp都可以很方便地调用 Http 接口。也可以抽象,不管你用什么方法都是提供了一个调用工具,我们要拿工具来用就要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对于调用层还没有抽象的打算,如果考虑到抽象一定会用Supplier去实现。

消费结果

最终我们都需要对调用获取的结果进行消费,宏观上只能消费一次。对应的Lambda式子:

  1. (T) -> {} 

对T进行消费是没有返回值的。就像吃一个苹果,吃完之后是不会立即有产物的,否则你要赶紧吃点 💊。

Java中提供了Consumer接口来作为消费的Lambda接口,非常容易理解。

但是在Payment Spring Boot中对请求结果是需要返回给调用端的,也就是需要返回值的,当时我考虑了很久,在Function和Consumer之间,最终还是选择了Consumer,或许就是它更接近消费的本质。

4. 总结

Payment Spring Boot项目目前已经建立了一个良好的迭代机制,通过今天的分享,希望能帮助你看透项目中的一些需求的本质,抽象它们,找出它们的串联关系。好了今天的分享就到这里,我是:码农小胖哥,多多关注,分享日常开发中的点点滴滴。

 

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

本文转载自微信公众号「 码农小胖哥」,可以通过以下二维码关注。转载本文请联系 码农小胖哥公众号。

 

责任编辑:武晓燕 来源: 码农小胖哥
相关推荐

2009-08-07 10:00:00

在Eclipse中安装

2023-08-29 07:42:21

离线数仓实时数仓

2011-07-05 18:23:23

java

2018-11-06 10:51:07

Redis开发存储系统

2011-08-22 15:47:27

Oracle临时表存储过程

2010-01-07 15:29:59

VB.NET表达式

2011-06-14 09:27:43

高性能WEB开发

2011-07-07 10:49:41

JavaScript

2011-10-09 14:23:02

开发

2010-02-02 13:15:00

C++ lambda函

2010-08-10 11:04:19

部署SCOMWindows Ser

2010-08-20 13:45:43

DB2数据库

2011-07-08 15:20:30

seamjsf

2018-05-07 15:28:45

项目开发管理

2011-05-16 09:30:30

jQueryWCF

2010-01-14 18:14:22

VB.NET开发特点

2012-12-27 10:05:15

2013-04-28 13:52:05

app

2024-03-12 08:23:54

JavaLambda函数式编程

2011-04-25 16:56:34

Greedy Bank游戏开发独立开发者
点赞
收藏

51CTO技术栈公众号