Java中如何将Callback function作为参数?该用法是否属于回调?
Java 无返回值函数参数传递实现方案
核心实现逻辑:函数式接口
Java本身不支持直接将函数作为参数传递,Java 8及以上版本通过函数式接口实现和JS类似的传函数参数能力。函数式接口指仅包含一个抽象方法的接口,可以用Lambda表达式或者方法引用快速实现。
你当前需求里的处理逻辑都是接收单个参数、无返回值,直接用JDK自带的java.util.function.Consumer<T>接口即可,它的唯一抽象方法是void accept(T t),完全匹配你的使用要求。
你的需求具体代码实现
Java 8及以上版本写法
import java.util.List; import java.util.function.Consumer; // 函数A:负责遍历列表,接收元素处理逻辑作为参数 public void processList(List<String> textList, Consumer<String> elementHandler) { for (String text : textList) { elementHandler.accept(text); // 由函数A决定何时调用传入的处理逻辑 } } // 函数B:你自定义的解析打印逻辑,也可以替换为数据库查询等任意无返回值操作 public void parseAndPrint(String text) { // 此处写你的自定义解析逻辑 String parsedResult = "解析结果:" + text; System.out.println(parsedResult); } // 调用场景1:直接打印原始文本 processList(你的文本列表, System.out::println); // 等价Lambda写法:processList(你的文本列表, text -> System.out.println(text)); // 调用场景2:调用函数B解析后再打印 processList(你的文本列表, this::parseAndPrint); // 等价Lambda写法:processList(你的文本列表, text -> parseAndPrint(text));
Java 8之前版本兼容写法
如果使用Java 8之前的版本,没有内置的Consumer接口,可以自定义函数式接口,通过匿名内部类实现:
import java.util.List; // 自定义匹配需求的函数式接口 public interface StringHandler { void handle(String text); } // 函数A定义调整为接收自定义接口参数 public void processList(List<String> textList, StringHandler handler) { for (String text : textList) { handler.handle(text); } } // 调用场景1:直接打印 processList(你的文本列表, new StringHandler() { @Override public void handle(String text) { System.out.println(text); } }); // 调用场景2:调用函数B处理 processList(你的文本列表, new StringHandler() { @Override public void handle(String text) { parseAndPrint(text); } });
关于回调函数的定义
这种用法完全可以正确称为回调函数(Callback Function)。
回调函数的核心特征就是:你将一个函数作为参数传入另一个函数,由接收参数的函数在特定时机(比如你这里遍历到每个元素的时候)主动调用这个传入的函数。你在JS中用到的回调和Java的这种实现本质逻辑完全一致,只是Java受语言特性限制,需要用函数式接口做一层包装。
内容的提问来源于stack exchange,提问作者itsaunix
相关产品推荐
相关产品推荐

