定义
函数A执行时需要先给它传递函数B, 好在合适的时候调用, 以完成函数A. 这个被传入的函数B被称为回调函数(Callback function).
如何理解
在调用库中某些预先备好的目标函数时, 需要先给该函数传递另一个函数, 让库中的目标函数在合适的时候, 去调用传给它函数来完成目标函数.
打个比方
假如你去一家餐厅吃饭, 你告诉服务员说你要吃饭, 然后她会让你对着菜单点菜, 你点完菜后她就会陆续地将才给你上来.
你要吃饭的行为就相当于库中的目标函数(通常称之为中间函数), 但进行这个行为前, 你需要告诉服务员你要点什么, 点什么菜是由你决定的, 点菜的这个行为也就是回调函数.
与函数间调用不同的是:
中间函数在接收一个回调函数前是不完整的;
通过实回调函数实现的不同,可以改变中间函数的行为, 所以它非常灵活
如何使用回调函数
1. 首先定义一个回调函数的接口, 方便回调函数能根据业务的不同,实现不同的实例.
/**
* @author Huzz
* @created 2021-11-11 13:40
*/
public interface CallbackInterface {
/**
* 回调函数
* @param param
* @return
*/
boolean process(String param);
}
2. 定义中间函数, 并在中间函数中调用回调函数. 中间函数时你直接使用的函数, 你只是在该函数中调用了你定义的回调函数, 它和普通函数没有什么区别.
/**
* @author Huzz
* @created 2021-11-11 13:38
*/
@Data
public class Huzz {
/**
* 中间函数
* @param callbackInterface 回调函数
*/
public String execute(CallbackInterface callbackInterface){
System.out.println("before: 中间函数的内容");
boolean result = callbackInterface.process("TEST");
System.out.println("after: 中间函数的内容");
return result ? "相同": "不相等";
}
}
3. 使用回调函数.
public static void main(String[] args) {
/**
* 这是我们要使用的对象.
* 此刻我们需要在这个对象中调用一个函数去做一些事情(这个函数比较特殊, 被叫做中间函数).
* 于是我们先实例化这个对象
*/
Huzz huzz = new Huzz();
/**
* 调用中间函数: execute()
* 执行中间函数的时候需要先给它传递一个函数作为参数,这个函数叫做回调函数: process()
* 回调函数写法:
* // 拉姆达表达式
* param -> {}
* 或
* // 通常写法
* new CallbackInterface() {
* @Override
* public Boolean process(Object param) {
* return null;
* }
* }
*
*/
String result = huzz.execute(param -> {
System.out.println("RUN");
if ("TEST".equals(param)) {
return true;
}
return false;
/**
* 可以看到中间函数execute()执行过程中,调用执行了回调函数process()
* 看似类似普通函数中的简单调用, 但回调函数却有着很大的灵活性,
* 如下 再调用中间函数实现一些不同的行为试试
*
*/
});
/**
* 回调函数实现不同的行为
*/
huzz.execute(new CallbackInterface() {
@Override
public boolean process(String param) {
if (param.length() == 4) {
return true;
}
return false;
}
});
}