回调函数在 JavaScript 中经常用到,回调函数可以提升我们这一个函数的重用率,降低代码冗余的问题。
JavaScript 定义回调函数简单,在函数中的参数里面直接添加一个函数,函数拿到这个变量之后加上小括号即可执行函数:
// 定义函数,第二个参数是回调函数,回调函数接收一个参数 function write(something, callable) { callable("Hello Callable"); } // 使用函数,第二个回调函数接收参数,打印其参数 write('eat bread', function (s) { console.log(s); })
在回调函数内,除了write
函数本身应该做的固定任务以外,回调函数里面可以根据业务不同实现不同的任务,这样就可以提升我们函数的重用率,也降低了代码冗余的问题。
Java 也是有回调函数的,回调函数的定义和好处跟 JavaScript 的回调函数一样。Java 定义回调函数可能有点“复杂”。
回调函数本身就允许我们程序员根据业务不同需求来,所以,在 Java 中接口就是非常适合作为回调函数的承担者。接口的函数需要我们去“实现”,也就是这个实现可以根据我们使用场景自定义。
我通过一个 I/O 流实现回调函数使用的案例:
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);
要实现实际给文件写入内容以外,其他代码都是固定的,无非就是打开输出流,关闭输出流的操作。只有写入的内容,根据业务场景,发生变化而已,所以在这里使用回调函数代替执行,而不影响我们的固定操作。
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); } }); }