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. 1.jQuery入口函数 与javaScript入口函数

    1.jQuery入口函数 与javaScript入口函数 JQ入口函数: $(document).ready(function(){ }); 或者 $(function(){ }) Js入口函数: w ...

  2. jQuery入口函数与JavaScript入口函数的区别

    jQuery  的入口函数是在  html  所有标签 (DOM) 都加载之后就会去执行 JavaScript  的  window.onload  时间是等到所有内容,包括外部图片之类的文件加载完成 ...

  3. JavaScript之函数,词法分析,内置对象和方法

    函数 函数定义 JavaScript中的函数和Python中的非常类似,只是定义方式有点区别. // 普通函数定义 function f1() { console.log("Hello wo ...

  4. JavaScript原生函数(内置函数)

    1.JavaScript原生函数(内置函数) JavaScript原生函数(内置函数)有: String() Number() Boolean() Array() Object() Function( ...

  5. 理解javascript 回调函数

    ##回调函数定义 百度百科:回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不 ...

  6. javascript 回调函数

    在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply() ...

  7. 02、Java的lambda表达式和JavaScript的箭头函数

    前言 在JDK8和ES6的语言发展中,在Java的lambda表达式和JavaScript的箭头函数这两者有着千丝万缕的联系:本次试图通过这篇文章弄懂上面的两个"语法糖". 简介 ...

  8. 理解 JavaScript 回调函数并使用

    JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...

  9. 【java回调】java两个类之间的回调函数传递

    背景交代:熟悉用js开发的cordovaAPP:对java一窍不通的我,老师让做一个监测用户拍照事件的功能,无奈没有找到现成的库,无奈自己动手开发java插件~~0基础java GreenHand,祝 ...

随机推荐

  1. 基于Web的CAD一张图协同在线制图更新轻量级解决方案[示例已开源]

    背景 之前相关的博文中介绍了如果在Web网页端展示CAD图形(唯杰地图云端图纸管理平台 https://vjmap.com/app/cloud),有不少朋友问,能不能实现一个协同的功能,实现不同部门不 ...

  2. 【Redis】简单动态字符串SDS

    C语言字符串 char *str = "redis"; // 可以不显式的添加\0,由编译器添加 char *str = "redis\0"; // 也可以添加 ...

  3. Pytorch中的Sort的使用

    >>> a = torch.randn(3,3)>>> atensor([[ 0.5805, 0.1940, 1.2591], [-0.0863, 0.5350, ...

  4. QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL

    QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL 课程1   C语言程序设计高级实用速成课程 基础+进阶+自学 课程2   C语言程序设计Windows GDI图形绘 ...

  5. dotnet 使用 Crossgen2 对 DLL 进行 ReadyToRun 提升启动性能

    我对几个应用进行严格的启动性能评估,对比了在 .NET Framework 和 dotnet 6 下的应用启动性能,非常符合预期的可以看到,在用户的设备上,经过了 NGen 之后的 .NET Fram ...

  6. BUUCTF-穿越时空的思念

    穿越时空的思念 音频题的话一般是摩尔斯电码,软件打开音频发现 短的为. 长的为- 空缺的为空格 ..-. ----- ..--- ----. -... -.. -.... ..-. ..... ... ...

  7. 教你用VS code 生成vue-cli代码片段

    可以自定义设置名字:name.json { "Print to console": { "prefix": "vue", "bod ...

  8. 解开XAML的邪恶面纱

    什么是XAML,首先我们看下它的外观 <Window x:Class="Blend_WPF.WindowStyle"        xmlns="http://sc ...

  9. 使用强大的DBPack处理分布式事务(PHP使用教程)

    主流的分布式事务的处理方案 近些年,随着微服务的广泛使用,业务对系统的分布式事务处理能力的要求越来越高. 早期的基于XA协议的二阶段提交方案,将分布式事务的处理放在数据库驱动层,实现了对业务的无侵入, ...

  10. OWL页面创建Copy功能,把选择内容复制到QC