当前位置: 首页 > news >正文

函数式接口与回调函数实践

函数式接口与回调函数实践

一、Java 的函数式接口

是指仅包含一个抽象方法的接口,通常用于 lambda 表达式或方法引用。Java 8 引入了很多内置的函数式接口,比如 Runnable、Callable、Predicate、Function、Consumer 等

演示,数据类型转换的函数式接口的简单使用

step 1 定义函数式接口

@FunctionalInterface
public interface ConvertFunctionalInterface<F, T> {/*** 把F转换为T 类型* @param form 输入对象 F* @return 输出对象 T*/T convert(F form);
}

step 2 定义同一调用方法类

public class DataConvert{/*** 把F转换为T 类型* @param data 输入对象 F* @return 输出对象 T*/public static <F, T> T processData(F data, ConvertFunctionalInterface<F, T> functional) {return functional.convert(data);}
}

step 3.定义数据类型转换方法

public class BuildObjTool {public static FillTaskSqlEntity buildFillTaskSql(FillTaskSqlDTO fillTask) {FillTaskSqlEntity fillTaskSql = new FillTaskSqlEntity();fillTaskSql.setExecuteSql(fillTask.getExecuteSql());fillTaskSql.setBatch(fillTask.getBatchTime());return fillTaskSql;}public static ValidTableFieldReqDTO buildValidTableField(CreateTableRelateReqDTO createTable){ValidTableFieldReqDTO valid = new ValidTableFieldReqDTO();valid.setUserId(createTable.getUserId());valid.setEnterpriseId(createTable.getEnterpriseId());valid.setCollectionTarget(createTable.getCollectionTarget());}}

step 4 代码中使用示例

FillTaskSqlEntity fillTask = DataConvert.processData(fillTaskSql, BuildObjTool::buildFillTaskSql);

写到这里,似乎还没体会到函数式接口的好处吧?

如果第二处涉及类型转换,那么,如下:

ValidTableFieldReqDTO valid = DataConvert.processData(createTableRelateReqDTO, BuildObjTool::buildValidTableField);

如果涉及几十处类型转换,那么,对外的转换接口只有这一个,自己传入入参对象,转换方法,以及接收对象。
函数式接口极大地提高了 Java 的灵活性和可读性,使得许多编程模式更为简洁和易于理解。它们在事件处理、异步编程、策略模式以及集合处理等多个场景中都得到了广泛应用

二、回调函数

回调(Callback)是一种编程模式,其中一个函数(或方法)在执行完成后通过调用另一个函数(或方法)来传递执行结果,或在特定事件发生时调用。这种模式常用于异步操作、事件驱动编程中,可以提升代码的可扩展性、灵活性和模块化
在这里插入图片描述

示例1:有返回值的,同步调用案例:
step 1 定义回调接口

interface Callback3 {String onComplete(String result);
}

step 2 定义任务类

class Task3 {public String execute(Callback3 callback3) {// 模拟一些业务逻辑处理String result = "模拟一些业务逻辑处理!";System.out.println("step 1…………………execute……………");// 回调通知调用方String res = callback3.onComplete(result);return res;}
}

step 3 业务调用

public static void main(String[] args) {Task3 task3 = new Task3();// 通过匿名类实现回调String res = task3.execute(result -> {System.out.println("step 2.Callback received: " + result);return "我是中国";});System.out.println("main ======res:"+res);
}

示例2:看一个创建无关系表中实际使用的回调函数:

step 1.创建回调接口

public interface CallBackInterface {List<Map<String, Object>> onComplete(int maxLength);
}

step 2 回调方法类

public class CallBackTask {public List<Map<String, Object>> execute(CallBackInterface callback, Map<String, List<Map<String, Object>>> result) {// 贪心算法计算数据最长表int maxLength = BuildObjTool.greedyAlgorithm(result);return callback.onComplete(maxLength);}
}

step 3 业务中调用

 CallBackTask callBackTask = new CallBackTask();List<Map<String, Object>> buildRespList = callBackTask.execute(res -> BuildObjTool.buildEachTableDataResp(result, createTableInfo, res), result);

复盘一下:
1.业务调用,首先进入CallBackTask 执行execute方法
2.CallBackTask 的execute方法,返回贪心算法得到的长度maxLength
3.回调再调用业务方法中的BuildObjTool.buildEachTableDataResp(result, createTableInfo, res) 执行完返回得到的buildRespList
总路线:业务-->回调任务--->业务

其中用到的工具方法:

public class BuildObjTool {//贪心算法public static int greedyAlgorithm(Map<String, List<Map<String, Object>>> result) {int max = 0;for (List<Map<String, Object>> list : result.values()) {int length = list.size();max = Math.max(max, length);}return max;}//把数据组装成List<Map>>结构public static List<Map<String, Object>> buildEachTableDataResp(Map<String, List<Map<String, Object>>> result, CreateTableInfoReqDTO createTableInfo, int maxLength) {List<Map<String, Object>> resp = new ArrayList<>();List<CreateTableFieldReqDTO> tables = createTableInfo.getTables();// 1.获取每张表对应取了哪些字段Map<String, List<String>> tableFieldMap = tables.stream().collect(Collectors.toMap(CreateTableFieldReqDTO::getEntityName,item -> item.getFields().stream().map(CreateTableFieldTypeReqDTO::getTargetFieldName).collect(Collectors.toList()), (k1, k2) -> k1));// 2.循环-以最长元素集合为标准for (int i = 0; i < maxLength; i++) {Map<String, Object> map = new ConcurrentHashMap<>();int finalI = i;result.forEach((key, value) -> {// 4.依次取每个表数据的第i条数据int size = value.size();Map<String, Object> eachMap;if (size > finalI) {eachMap = value.get(finalI);} else {eachMap = null;}List<String> fieldList = tableFieldMap.get(key);// 5.获取字段对应的数据fieldList.forEach(ite -> {Object obj = null;if (ObjectUtils.isNotEmpty(eachMap)) {obj = eachMap.get(ite);}// 6.存储值到map---没有值的话去获取该字段对应类型的默认值map.put(ite, Objects.nonNull(obj) ? obj : getFieldDefaultValue(ite, createTableInfo));});});resp.add(map);}return resp;}}

总结:Java中的回调机制(Callback)是实现异步编程、解耦代码、灵活处理任务的一种重要方式。通过回调,方法A可以在方法B完成时被通知并处理结果。Java的回调机制并不像JavaScript那样原生支持函数作为参数,但通过接口、匿名类或Lambda表达式,可以轻松实现类似的效果。

相关文章:

函数式接口与回调函数实践

函数式接口与回调函数实践 一、Java 的函数式接口 是指仅包含一个抽象方法的接口&#xff0c;通常用于 lambda 表达式或方法引用。Java 8 引入了很多内置的函数式接口&#xff0c;比如 Runnable、Callable、Predicate、Function、Consumer 等 演示&#xff0c;数据类型转换的函…...

Windows11系统如何使用自带的录音、录屏工具?

电脑录音和录屏作为现代办公的辅助工具&#xff0c;不仅极大地提升了工作效率&#xff0c;也保障了信息传递的准确性和完整性。通过合理利用这些工具&#xff0c;我们可以更好地保存和管理重要资料&#xff0c;为办公带来无与伦比的便利。 在会议记录、讲座学习、语音备忘等场景…...

使用 web (vue 和DRF))实现 模拟一个IDE 功能思路

采用文件系统和数据库相结合的方案&#xff0c;不仅可以实现基本的文件管理&#xff0c;还可以为未来的扩展提供灵活性。结合我们讨论的内容&#xff0c;以下是更完善的策略&#xff1a; 方案概述&#xff1a;文件系统与数据库结合 文件系统负责实际的文件存储和执行操作&…...

智航船舶租赁综合管理系统

1.产品介绍 产品介绍方案 产品名称: 智航船舶租赁综合管理系统 主要功能: 船舶信息管理租赁合同管理运营调度与优化财务分析与报告功能介绍: 1. 船舶信息管理 具体作用与使用方式:该功能模块允许用户录入、编辑和查询所有船舶的详细信息,包括但...

统信UOS下启动图形界面应用工具monitor报JAVA相关错:An error has occurred. See the log file

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、前言 在博文《基于飞腾2000CPU浪潮电脑统信UOS安装达梦数据库详解 https://blog.csdn.net/LaoYuanPython/article/details/143258863》中介绍了基于飞腾2000CPU浪潮电脑统信UOS安装达梦数据库的详细过程…...

N-154基于springboot酒店预订管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;AdminLTEBootstrapLayUIHTMLjQuery 服务端技术&#xff1a;springbootmybatis-plusthymeleaf 本项目分前台和后台…...

微信小程序如何实现地图轨迹回放?

要在Uni-app中实现微信小程序的地图轨迹回放功能&#xff0c;你可以按照以下步骤进行操作&#xff1a; 在Uni-app项目中引入地图组件&#xff1a;在页面中使用uni-app提供的map组件&#xff0c;可以使用uni.createMapContext方法获取地图上下文对象&#xff0c;以便后续操作地图…...

vscode的一些使用心得

问题1&#xff1a;/home目录空间有限 连接wsl或者remote的时候&#xff0c;会在另一端下载一个.vscode-server&#xff0c;vscode的插件都会安装进去&#xff0c;导致空间增加很多&#xff0c;可以选择更换这个文件的位置 参考&#xff1a;https://blog.csdn.net/weixin_4389…...

Python金色流星雨(完整代码)

文章目录 环境需求完整代码下载代码代码分析1. 导入库和窗口设置2. 创建画笔对象3. 流星的颜色4. 定义流星类`Meteor`5. `meteor`方法:绘制流星6. `move`方法:流星的运动7. 创建流星对象列表8. 动画循环总结系列目录写在后面环境需求 python3.11.4PyCharm Community Edition …...

[山河CTF 2024] week3

一周不在家&#xff0c;这是补的最后一篇。后边的还有0xgame和shctf的末周。打不动了。 Crypto Approximate_n 题目分两部分&#xff0c;flag分两块两个RSA&#xff0c;第1个泄露了4个n_approxkpr的值&#xff0c;后边只泄露了1个。 第1部分利用以前的模板&#xff0c;造格…...

Java集合常见面试题总结(5)

HashSet 如何检查重复? 当你把对象加入HashSet时&#xff0c;HashSet 会先计算对象的hashcode值来判断对象加入的位置&#xff0c;同时也会与其他加入的对象的 hashcode 值作比较&#xff0c;如果没有相符的 hashcode&#xff0c;HashSet 会假设对象没有重复出现。但是如果发…...

牛客网刷题(3)(Java的几种常用包)

目录 一、牛客网案例题目。 二、Java常用包的总结。 <1>JAVA常用包&#xff08;图片&#xff09;。 <2>java.lang包。 <3>java.util包。 &#xff08;1&#xff09;集合框架。 1、Collection接口。 2、List接口。 3、Set接口。 4、Queue接口。 5、Map接口。 …...

PyTorch nn.Conv2d 空洞卷积

torch.nn.Conv2d() 中 dilation 参数控制卷积核的间隔 dilation controls the spacing between the kernel points 当 dilation1 时, 表示卷积核没有额外的空白间距, 也就是标准卷积当 dilation>1 时, 表示空洞卷积(dilated convolution) 动画演示: 手动计算 以 2*2 的卷…...

像素、分辨率、PPI(像素密度)、帧率的概念

文章目录 前言一、像素1、定义2、像素点也不是越多越好 二、分辨率1、定义 三、PPI(像素密度)1、定义2、计算公式3、视网膜屏幕 四、帧率1、帧 (Frame)2、帧数 (Frames)3、帧率 (Frame Rate)4、FPS (Frames Per Second)5、赫兹 五、其他1、英寸2、为何显示器尺寸以英寸命名 总结…...

两步GMM计算权重矩阵

在广义矩方法&#xff08;GMM&#xff09;中&#xff0c;权重矩阵(W)的选择是关键的一步。理想情况下&#xff0c;(W)应该等于矩条件的协方差矩阵的逆矩阵。这是因为使用这样的权重矩阵可以使得估计量达到最小方差&#xff0c;从而提高估计效率。 两步GMM计算权重矩阵(W) 第一…...

leetcode452. 用最少数量的箭引爆气球

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一…...

【Android】使用TextView实现按钮开关代替Switch开关

介绍 Android 本身自己带的有开关控件&#xff0c;但是很多时候我们是不愿意使用这种开关的&#xff0c;感觉使用起来比较麻烦&#xff0c;特别是遇到需要延迟操作的情况。 比如有一个需求是这样的&#xff1a;我们需要打开一个设置&#xff0c;但是这个设置是否打开需要经过…...

(49)MATLAB实现迫零均衡器原理与代码

文章目录 前言一、迫零均衡器设计说明二、迫零均衡器MATLAB源代码1.函数说明2.代码实现3.辅助函数 前言 使用MATLAB实现迫零均衡器。给出完整的MATLAB设计源代码。 一、迫零均衡器设计说明 理想的迫零均衡器有无限多个抽头权系数&#xff0c;是不能实现的&#xff0c;本文考虑…...

滚柱导轨出现异常损坏的原因

滚柱导轨是一种精密的直线滚动导轨&#xff0c;具有较高的承载能力和较高的刚性&#xff0c;对反复动作、起动、停止往复运动频率较高情况下可减少整机重量和传动机构及动力成本。滚柱导轨可获得较高的灵敏度和高性能的平面直线运动&#xff0c;在重载或变载的情况下&#xff0…...

架构师考试系列(6)论文专题:论分布式架构设计

论分布式架构设计 摘要: 2020年2月,我司中标了某省电力公司的配网运维管控项目,该项目接入电力公司营销、设备和调度等多个部门的专业数据,为配网运行、配网检修、配网抢修、配网工程、供电服务等核心业务提供数据支撑。由于本项目是省级项目,系统可靠性、可用性要求比较…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...