如何定义 java 的回调函数,与 javascript 回调函数的区别_shiramashiro-编程思维

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);
			}
		}
	});
}

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/shiramashiro/p/16424285.html

postmessage使用_蓓蕾心晴-编程思维

参考自文档:https://www.runoob.com/js/met-win-postmessage.html postMessage 方法用于安全地实现跨域通信。 涉及到通信,则会有信息发送方 和 信息接收方。 发送方,调用 postMessage 方法,发送 message ,接收方,在 window 下监听 m

抽奖动画_鲤鱼跳龙门_nd-编程思维

pageClass: home-page-class 鲤鱼跳龙门动画 1. 需求 年中618营销活动要求做一个鲤鱼跳龙门的动画,产品参考了支付宝上的一个动画,要求模仿这个来做一个类似的动画。产品提供的截屏视频如下: 图1 从这个视频里得到的信息,我们可以把动画分解一下: 321倒计时结束,动画开始播放。 小河背景向下滚

javascript扩展原型链浅析_程序员布欧-编程思维

前言 上文对原型和原型链做了一些简单的概念介绍和解析,本文将浅析一些原型链的扩展。 javaScript原型和原型链http://lewyon.xyz/prototype.html 扩展原型链 使用new操作符 利用原型是对象的特性,实例化对象的时候,继承多个构造函数的属性和方法 兼容性:支持目前以及所有可想象到的

js定时器:setinterval()和settimeout()_ryan_zheng-编程思维

JavaScript 对象指既可以保存一组不同类型的数据(属性),又可以包含有关处理这些数据的函数(方法)的特殊数据类型。JS 对象可以使用两种方式获得,一是开发人员自定义;二是由 ECMAScript 提供。由 ECMAScript 提供的对象称为 JavaScript 内置对象。JS 常用的 JavaScript

记一次排查线上mysql死锁过程,不能只会curd,还要知道加锁原理_一灯架构-编程思维

昨晚我正在床上睡得着着的,突然来了一条短信。 啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志。 能清楚看到是这条insert语句发生了死锁。 MySQL如果检测到两个事务发生了死锁,会回滚其中一个事务,让另一个事务执行成功。很明显,我们这条insert语句被回滚了。 insert into user (

福大图书馆预约的流程java实现_jessielin-编程思维

提示信息 1.登录需要用到csrf防护的参数,需要手动get kjgl.fzu.edu.cn后获取。参数在dom中的id是SYNCHRONIZE_TOKEN和SYNCHRONIZE_URI。可以用jsoup(python可以用beautifulsoup)通过getElementById获取它的attr的value。记住