[Java] 回调函数
回调函数
除了一些函数中存在固定的代码以外,还有一部分是根据实际的业务来写不同的代码,而这一块的内容最适合用回调函数来代替。回调函数相当于一个占位符,这里的代码由调用者传递执行,回调函数可以提升函数的重用率。
定义回调函数
定义回调函数的接口,接口只提供一个抽象函数,具体实现由实体业务来决定:
interface Callable {
void append(FileWriter fw);
}
在普通的类中某个函数参数中添加该回调函数的接口,调用者通过 new 接口并实现抽象函数,被回调函数暂时替代的地方就换成了具体的业务代码:
public class WriteText {
public void write(String filename, Callable callable) {
FileWriter fw;
try {
fw = new FileWriter(filename, true);
callable.append(fw);
fw.flush();
fw.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
测试回调函数
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);
}
});
}
不管 5~10 行代码怎么变化,都不影响实例化输出流、关闭输出流等操作。下面是不使用 lambda 表达式的写法:
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("-----------------");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步