如何定义 Java 的回调函数,与 JavaScript 回调函数的区别
JavaScript 中的回调函数
在 JavaScript 中经常使用回调函数,比如:get 请求、post 请求等异步任务。在我们请求之前以及请求之后,都需要完成一些固定的操作,比如:请求之前先从浏览器中创建 XMLHttpRequests 对象,完成之后关闭请求,释放资源等。等这些固定操作完成之后,可能需要我们根据实际情况来完成一些自定义任务。比如,请求之后的数据我们该如何去处理;这些任务我们不可能直接修改写好的请求函数中,一百个不一样的任务我们就修改一百个不一样的请求函数?不可能!所以,回调函数就是一个非常好的编程思维。
回调函数可以提升函数的重用率,从而降低代码冗余。定义 JavaScript 回调函数非常的简单:在函数中添加一个参数作为回调函数;由于 JavaScript 的特性,在参数之后加上小括号,就可以当做一个函数来执行:
// 定义函数,第二个参数是回调函数
function write(something, callable) {
callable("Hello Callable");
}
// 使用函数
write('eat bread', function (s) {
console.log(s);
});
write('eat bread', function (s) {
let re = s.split(" ");
for (let i = 0; i < re.length; i++) {
console.log(re[i]);
}
})
Java 中的回调函数
既然回调函数这么好用,就拿我自身的经验来讲,很少甚至从来没有听说过 Java 可以定义回调函数,书上没有教,老师也没有教。冒出这样的想法也是因为学习了 JavaScript,但实际上 Java GUI 编程中的监听器大量使用了回调函数编程思维。
Java 的接口(interface)中的一个个函数都是等待这我们去实现的,它不是一个具体的函数。这样就非常符合我们回调函数的定义,听说过 Java 要面向接口编程,也是有道理的哦!
定义回调函数接口
interface WriteTextCallable {
void append(FileWriter fw);
}
调用回调函数
public class WriteText {
public void write(String filename, WriteTextCallable writeTextCallable) {
FileWriter fw;
try {
fw = new FileWriter(filename, true);
// 使用回调函数
writeTextCallable.append(fw);
fw.flush();
fw.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
其他代码都是固定的,也就是打开输出流、关闭输出流的操作。只有写入的内容要根据业务场景发生变化而已,所以在这里使用回调函数writeTextCallable.append(fw);代替执行,而不影响我们的固定操作。
测试回调函数
Lambda 简写形式:
public static void main(String[] args) {
WriteText wt = new WriteText();
wt.write("E:\\Common\\Document\\Person\\fw.txt", fw -> {
try {
fw.write("\n");
fw.write("时间:" + new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date()));
fw.write("\n");
fw.write("事情:打豆豆");
fw.write("\n");
fw.write("-----------------");
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
完整书写形式:
public static void main(String[] args) {
WriteText wt = new WriteText();
wt.write("E:\\Common\\Document\\Person\\fw.txt", new WriteTextCallable() {
@Override
public void append(FileWriter fw) {
try {
fw.write("\n");
fw.write("时间:" + new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date()));
fw.write("\n");
fw.write("事情:打豆豆");
fw.write("\n");
fw.write("-----------------");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
}

如何定义 Java 的回调函数,与 JavaScript 回调函数的区别的更多相关文章
- 1.jQuery入口函数 与javaScript入口函数
1.jQuery入口函数 与javaScript入口函数 JQ入口函数: $(document).ready(function(){ }); 或者 $(function(){ }) Js入口函数: w ...
- jQuery入口函数与JavaScript入口函数的区别
jQuery 的入口函数是在 html 所有标签 (DOM) 都加载之后就会去执行 JavaScript 的 window.onload 时间是等到所有内容,包括外部图片之类的文件加载完成 ...
- JavaScript之函数,词法分析,内置对象和方法
函数 函数定义 JavaScript中的函数和Python中的非常类似,只是定义方式有点区别. // 普通函数定义 function f1() { console.log("Hello wo ...
- JavaScript原生函数(内置函数)
1.JavaScript原生函数(内置函数) JavaScript原生函数(内置函数)有: String() Number() Boolean() Array() Object() Function( ...
- 理解javascript 回调函数
##回调函数定义 百度百科:回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不 ...
- javascript 回调函数
在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply() ...
- 02、Java的lambda表达式和JavaScript的箭头函数
前言 在JDK8和ES6的语言发展中,在Java的lambda表达式和JavaScript的箭头函数这两者有着千丝万缕的联系:本次试图通过这篇文章弄懂上面的两个"语法糖". 简介 ...
- 理解 JavaScript 回调函数并使用
JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...
- 【java回调】java两个类之间的回调函数传递
背景交代:熟悉用js开发的cordovaAPP:对java一窍不通的我,老师让做一个监测用户拍照事件的功能,无奈没有找到现成的库,无奈自己动手开发java插件~~0基础java GreenHand,祝 ...
随机推荐
- MySQL - 数据库的隔离级别
MySQL - 数据库的隔离级别 隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read) 未提交读(Read uncommitte ...
- CabloyJS 4.12震撼发布,及新版教程尝鲜
引言 凡是可以用 JavaScript 来写的应用,最终都会用 JavaScript 来写 | Atwood 定律 目前市面上出现的大多数与 NodeJS 相关的框架,基本都将 NodeJS 定位在工 ...
- Groovy基础语法
Groovy 基础语法 变量定义 1.支持动态类型,使用def关键字定义变量 // Java中定义变量的方式 int age = 18; String name = "张三"; / ...
- php 使用phpqrcode生成二维码并上传到OSS
一般情况调用phpqrcode第三方插件 会把生成的二维码图片保存到服务器,不保存服务器也会以header头的形式输出到浏览器,(我们不允许把图片文件保存的liunx服务器,只能保存到阿里云OSS存储 ...
- robotframework之环境安装
一.安装python2.7环境,python --version查询python安装的版本 二.setuptools安装
- word-制作三线表
找一个表格或插入一个表格, 找到 [设计] [新建表格样式] [将格式应用于: 整个表格] 点击"框线设置"按钮,在弹出的下拉菜单中分别选择 [上框线] 和 [下框线],然后分别设 ...
- Windows-matlab简易安装-用于数字图像处理
安装 下载链接 解压文件得到 双击setup.exe 主要注意几点 使用文件安装密匙 只需安装这三个即可 将两个文件夹里面的dll文件复制到安装目录的 /bin/win64 目录 两个 .lic 文件 ...
- git 删除、合并多次commit提交记录
合并多次记录 1. git log找到要合并的记录的数量. 2. git rebase -i HEAD~5 将最上面一个的记录选为pack,下面记录都改为s. ================= 删除 ...
- 015(Power string)(哈希表)
题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1457 题目思路: 思路就是预设子串的长度,从1开始,而后一段一段试 试到一个对不上的就打回 如果 ...
- SpringBoot接口 - 如何优雅的对参数进行校验?
在以SpringBoot开发Restful接口时, 对于接口的查询参数后台也是要进行校验的,同时还需要给出校验的返回信息放到上文我们统一封装的结构中.那么如何优雅的进行参数的统一校验呢? @pdai ...