Java回调函数实例代码详解
什么是回调函数
回调函数是指函数在程序执行时由另外一个函数动态引用或调用的一种机制。具体而言,如果一个函数可以接受另一个函数作为参数,或者将其指定为某个事件处理器,那么这个被接受的函数就叫做回调函数。回调函数是异步编程中非常重要的一个工具,可以帮助我们编写出高效、易于维护的程序。
回调函数的用途
回调函数通常有两个用途:
- 事件处理器:比如图形用户界面中的按钮被点击后,就会触发按钮的回调函数。
- 延迟回调:即函数执行完毕后,才调用回调函数,可以用于异步编程或者在多线程中处理某个问题。
Java中的回调函数
Java中没有像JavaScript那样可以直接使用回调函数的语法,但是我们可以使用接口来实现回调函数的功能。具体步骤如下:
- 定义接口
public interface Callback {
void execute();
}
- 实现回调函数的主函数
public class MainFunction {
public static void doSomething(Callback callback) {
System.out.println("Doing something.");
callback.execute();
}
}
- 实现回调函数
public class CallbackImpl implements Callback {
@Override
public void execute() {
System.out.println("Callback function executed.");
}
}
- 调用函数并使用回调函数
public class TestCallback {
public static void main(String[] args) {
CallbackImpl callback = new CallbackImpl();
MainFunction.doSomething(callback);
}
}
上面的代码中,我们定义了一个Callback接口,其中只有一个execute方法用于执行回调函数。然后我们在MainFunction中定义了doSomething方法,并将Callback作为参数传递进去。在doSomething方法中,我们先打印了一句话,然后执行了回调函数。最后,在TestCallback中,我们实例化了CallbackImpl并将其传递给doSomething方法作为回调函数。
示例说明
示例1:计算器程序
假设我们正在写一个命令行计算器程序,我们需要用户输入两个数字和一个运算符,然后计算它们的结果并输出。这个程序中需要用到回调函数来判断运算符是否合法。
- 定义接口
public interface Callback {
void execute(String operator, int num1, int num2);
}
- 计算器程序
import java.util.Scanner;
public class Calculator {
public void add(int num1, int num2) {
System.out.println(String.format("%d + %d = %d", num1, num2, num1 + num2));
}
public void subtract(int num1, int num2) {
System.out.println(String.format("%d - %d = %d", num1, num2, num1 - num2));
}
public void multiply(int num1, int num2) {
System.out.println(String.format("%d * %d = %d", num1, num2, num1 * num2));
}
public void divide(int num1, int num2) {
try {
int result = num1 / num2;
System.out.println(String.format("%d / %d = %d", num1, num2, result));
} catch (ArithmeticException e) {
System.out.println("Error: division by zero.");
}
}
public void getInput(Callback callback) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the first number: ");
int num1 = scanner.nextInt();
System.out.print("Enter the second number: ");
int num2 = scanner.nextInt();
System.out.print("Enter the operator (+, -, *, /): ");
String operator = scanner.next();
callback.execute(operator, num1, num2);
scanner.close();
}
}
在上面的代码中,我们定义了一个Calculator类,其中有四个基本的数学运算方法:add、subtract、multiply和divide。此外,我们还定义了一个getInput方法,该方法接受一个Callback作为参数。在getInput方法中,我们让用户输入两个数字和一个运算符,并将这三个参数传递给回调函数。
- 回调函数的实现
public class CallbackImpl implements Callback {
@Override
public void execute(String operator, int num1, int num2) {
Calculator calculator = new Calculator();
switch (operator) {
case "+":
calculator.add(num1, num2);
break;
case "-":
calculator.subtract(num1, num2);
break;
case "*":
calculator.multiply(num1, num2);
break;
case "/":
calculator.divide(num1, num2);
break;
default:
System.out.println("Error: invalid operator.");
break;
}
}
}
在上面的代码中,我们实现了Callback接口中的execute方法,该方法接受一个运算符和两个数字作为参数,并根据运算符调用对应的计算方法。
- 测试程序
public class TestCalculator {
public static void main(String[] args) {
Calculator calculator = new Calculator();
CallbackImpl callback = new CallbackImpl();
calculator.getInput(callback);
}
}
在TestCalculator中,我们实例化了Calculator和CallbackImpl,并将CallbackImpl传递给getInput方法作为回调函数。当用户输入完数字和运算符后,CallbackImpl的execute方法将被调用,并进行对应的数学运算。
示例2:多线程文件下载器
假设我们正在写一个多线程的文件下载器程序,我们需要在下载完毕后执行某个任务。
- 定义接口
public interface Callback {
void execute();
}
- 下载器程序
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Downloader implements Runnable {
private String url;
private String filePath;
private Callback callback;
public Downloader(String url, String filePath, Callback callback) {
this.url = url;
this.filePath = filePath;
this.callback = callback;
}
@Override
public void run() {
try {
System.out.println("Downloading " + url);
URL urlObj = new URL(url);
InputStream inputStream = urlObj.openStream();
Files.copy(inputStream, Paths.get(filePath));
System.out.println("Download complete.");
callback.execute();
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
在上面的代码中,我们定义了一个Downloader类,该类实现了Runnable接口。在Downloader的构造函数中,我们传递了下载链接url、文件保存路径filePath以及回调函数callback。在Downloader的run方法中,我们下载了文件并将callback.execute()放在下载完成后执行。
- 回调函数的实现
public class CallbackImpl implements Callback {
@Override
public void execute() {
System.out.println("Task completed.");
}
}
在这个示例中,我们只需要执行一个简单的任务,当下载完成后输出"Task completed."即可。
- 测试程序
public class TestDownloader {
public static void main(String[] args) {
String url = "https://www.example.com/example.pdf";
String filePath = "example.pdf";
CallbackImpl callback = new CallbackImpl();
Downloader downloader = new Downloader(url, filePath, callback);
Thread thread = new Thread(downloader);
thread.start();
}
}
在上面的代码中,我们实例化了CallbackImpl和Downloader,并将CallbackImpl传递给Downloader作为回调函数。我们使用Thread启动了Downloader的run方法,当下载完成后,CallbackImpl的execute方法将被调用并输出"Task completed."。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java回调函数实例代码详解 - Python技术站