如何定义 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 超时配置
日志报错: No operations allowed after connection closed.; nested exception is com.mysql.jdbc.exceptions. ...
- 自动装箱与自动拆箱——JavaSE基础
自动装箱与自动拆箱 自动装箱与拆箱就是编译器蜜糖(Compiler Sugar) Integer a = 234; // 自动装箱,实际上是Integer a = Integer.valueOF(23 ...
- Linux Cgroup v1(中文翻译)(3):CPU Accounting Controller
英文原文: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/cpuacct.html CPU Accounting Contr ...
- GDKOI 2021 Day1 TG 。。。
看着一群群比 LHF , HQX 还强的大佬涌进了机房,本蒟蒻表示慌得一批 T1 讲题人说最简单的签到题本蒟蒻表示... \(Update\) 用 ds , dt 两个变量记录点 i 连向 s 或 t ...
- 全新升级的AOP框架Dora.Interception[3]: 基于特性标注的拦截器注册方式
在Dora.Interception(github地址,觉得不错不妨给一颗星)中按照约定方式定义的拦截器可以采用多种方式注册到目标方法上.本篇文章介绍最常用的基于"特性标注"的拦截 ...
- BUUCTF-文件中的秘密
文件中的秘密 下载图片属性查看即可发现flag.这算是图片必须查看的几个地方.
- RocketMQ事务消息机制
1.half消息对消费者不可见,用于确定MQ服务正常. 2.MQ响应half消息. 3.生产者执行本地事务. 4.生产者发送具体消息+本地事务状态,MQ根据本地事务状态执行Commit或者Rollba ...
- SQL报了一个不常见的错误,让新来的实习生懵了
摘要:前些天一个很简单的SQL报了一个不常见的错误. 本文分享自华为云社区<记一次mysql关联查询格式冲突问题[五月04]>,作者: KevinQ . 问题起源 作为CRUD程序员,最常 ...
- netty系列之:在netty中使用native传输协议
目录 简介 native传输协议的依赖 netty本地传输协议的使用 总结 简介 对于IO来说,除了传统的block IO,使用最多的就是NIO了,通常我们在netty程序中最常用到的就是NIO,比如 ...
- 使用Runnable和Callable接口实现多线程的区别
使用Runnable和Callable接口实现多线程的区别 先看两种实现方式的步骤: 1.实现Runnable接口 public class ThreadDemo{ public static voi ...