函数式接口灵活调用复用代码 分手后的思念是犯贱 2024-02-17 13:20 80阅读 0赞 > 业务场景: 跨系统业务数据同步的时候,需要调用三方系统的api,此时为了代码复用,想要设计一个较为通用的方法,这个方法有固定的步骤,但是具体执行的业务逻辑是不相同的,所以就需要用到函数式接口,传递方法来进行方法复用 待复用方法的执行过程如下: public static String sendDataRequest(Map<String, Object> headerParam, FunInterfaceSelf funInterfaceSelf) { // 第一步(固定):发送请求;查询token if (CollUtil.isEmpty(headerParam)) { String token = "abcccc"; System.out.println("第一步(固定):获取token,1.1 查询token"); headerParam = new HashMap<>(1); headerParam.put("token", token); } else { System.out.println("第一步(固定):获取token,1.2 传入的token"); } System.out.println("\r\n------------------------执行业务请求start----------------------------"); // todo 第二步(灵活):判断;解析三方系统的响应结果,如果是200, System.out.println("------------------------执行业务请求end----------------------------\r\n"); // 第三步(固定):发送请求记录到mysql中,便于排查 System.out.println("第三步(固定):存入数据库请求记录:" + JSONUtil.toJsonStr(apiLogData)); return null; } 第一思路就是利用函数式接口,将不同的业务执行判断逻辑进行传入,在调用的地方书写逻辑,最后思路大致如下,函数式接口可以理解为实现类的方法调用。 最终的代码版本如下: package com.lzq.learn.test.测试函数式编程; import cn.hutool.core.collection.CollUtil; import cn.hutool.json.JSONUtil; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; import java.util.Optional; /** * @author 刘志强 * @date 2023/12/2 10:30 */ public class FunctionalTest { public static void main(String[] a) { HashMap<String, Object> tokenParam = new HashMap<>(1); tokenParam.put("token", "lzq123456"); sendDataRequest(tokenParam, (headerParam) -> { // 1.处理参数 String address = "http://abc.com/addStudent"; String requestMethod = "get"; String requestData = null; String requestHeader = Optional.ofNullable(headerParam).map(JSONUtil::toJsonStr).orElse(null); String response = "添加成功"; String createTime = LocalDateTime.now().toString(); String result = String.format("请求方式 %s, 地址ulr %s, 请求头 %s, 请求数据 %s, 响应结果 %s, 请求时间 %s", requestMethod, address, requestHeader, requestData, response, createTime); // 2.执行调用 System.out.println("执行调用 , 执行过程为 = " + result); // 3.返回需要记录的日志结果 return ApiLogData.builder() .apiAddress(address) .apiRequestMethod(requestMethod) .apiRequestData(requestData) .apiResponse(response) .creatTime(createTime) .build(); }); } /** * <p>@Description: 公共方法,统一入口</p > * <p>@param [bodyParam, funInterfaceSelf]</p > * <p>@return java.lang.String</p > * <p>@throws </p > * <p>@author LiuZhiQiang</p > * <p>@date 2023/12/2 11:31</p > */ public static String sendDataRequest(Map<String, Object> headerParam, FunInterfaceSelf funInterfaceSelf) { // 第一步(固定):发送请求;查询token if (CollUtil.isEmpty(headerParam)) { String token = "abcccc"; System.out.println("第一步(固定):获取token,1.1 查询token"); headerParam = new HashMap<>(1); headerParam.put("token", token); } else { System.out.println("第一步(固定):获取token,1.2 传入的token"); } System.out.println("\r\n------------------------执行业务请求start----------------------------"); // 第二步(灵活):判断;解析三方系统的响应结果,如果是200, ApiLogData apiLogData = funInterfaceSelf.sendSelfApi(headerParam); System.out.println("------------------------执行业务请求end----------------------------\r\n"); // 第三步(固定):发送请求记录到mysql中,便于排查 System.out.println("第三步(固定):存入数据库请求记录:" + JSONUtil.toJsonStr(apiLogData)); return null; } } @FunctionalInterface interface FunInterfaceSelf { /** * 执行不同的业务请求,我不关心具体的逻辑,只要返回给我对应的请求日志信息即可,我要记录入库 * * @return */ public abstract ApiLogData sendSelfApi(Map<String, Object> headerParam); } @Data @AllArgsConstructor @NoArgsConstructor @Builder class ApiLogData { private String apiAddress; private String apiRequestMethod; private String apiHeaderParam; private String apiRequestData; private String apiResponse; private String creatTime; } 调用结果: ![在这里插入图片描述][609bc2b57b114cba8c7b4a5b8206e1c7.png_pic_center] [609bc2b57b114cba8c7b4a5b8206e1c7.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/02/06/ece0098bb66a4a66af547eaf4cb5e75f.png
相关 函数式接口灵活调用复用代码 > 业务场景: 跨系统业务数据同步的时候,需要调用三方系统的api,此时为了代码复用,想要设计一个较为通用的方法,这个方法有固定的步骤,但是具体执行的业务逻辑是不相同的,所以就 分手后的思念是犯贱/ 2024年02月17日 13:20/ 0 赞/ 81 阅读
相关 函数式接口 函数式接口(Functional Interface)是Java 8对一类特殊类型的接口的称呼。 这类接口只定义了唯一的抽象方法的接口,并且这类接口使用了`@Functiona 悠悠/ 2023年10月01日 09:26/ 0 赞/ 24 阅读
相关 函数式接口 目录 1.概念 2.注解 3.作用 4.分类 5.示例 -------------------- 1.概念 一个接口中可以存在默认方法和静态方法,但抽象方法 Myth丶恋晨/ 2023年09月27日 14:08/ 0 赞/ 180 阅读
相关 函数式接口 函数式接口的定义 只包含一个抽象方法的接口被称为函数式接口 我们可以在一个接口上使用@Functionallnterface注解,这样做可以检 查它是否是一个函数 缺乏、安全感/ 2023年06月30日 02:27/ 0 赞/ 21 阅读
相关 函数式接口 函数式接口 概述: 有且只有一个抽象方法的接口就是函数式接口 jdk中熟悉的函数式接口 :Runnable 注解: @FunctionalInterface 小灰灰/ 2023年01月02日 12:22/ 0 赞/ 255 阅读
相关 函数的代码和复用 文章目录 一、函数的理解和定义 二、代码的复用与函数递归 习题巩固 一、函数的理解和定义 1.熟悉函数的使用及调用过程 2.熟悉 女爷i/ 2022年09月10日 15:13/ 0 赞/ 356 阅读
相关 函数式接口 函数式接口 函数式接口指的是只有一抽象方法的接口,比如java.lang.Runnable就是一个函数式接口,在Runnable接口中只有一个run()方法: 红太狼/ 2022年09月07日 09:52/ 0 赞/ 236 阅读
相关 函数式接口 day12【函数式接口、方法引用】 主要内容 常用函数式接口 Lambda表达式 方法引用 1.格式 2.什么时候使用方法引用的替 Dear 丶/ 2022年02月24日 15:54/ 0 赞/ 329 阅读
相关 函数和代码复用 --Python 1、关于递归函数的描述,以下选项中正确的是 A.包含一个循环结构 B.函数比较复杂 C.函数内部包含对本函数的再次调用 D.函数名称作为返回值 答案:D 秒速五厘米/ 2021年12月01日 15:08/ 0 赞/ 761 阅读
还没有评论,来说两句吧...