Java中如何在自定义Runnable类中定义可接收Lambda的回调方法
实现方案与完整代码
核心逻辑:要让retrieveCallback方法支持接收Lambda表达式,只需要将方法入参定义为符合Java语法要求的函数式接口类型,同时将传入的回调实例存储为类成员变量,等run方法完成计算后主动触发回调把结果传出即可。
代码修正与实现步骤
- 先修复原代码中的基础语法与逻辑错误:
Runnable是Java内置接口,不能通过extends继承,需要使用implements实现- 原
run方法中的float sum - 0是语法错误,应修正为赋值语句float sum = 0 - 原线程启动逻辑存在缺陷:空参构造的
Thread没有绑定RandomSum实例,启动后不会执行自定义求和逻辑
- 定义匹配Lambda签名的入参类型:你的Lambda逻辑是接收一个计算完成的sum值、执行打印操作、无返回值,这种场景可以直接使用JDK内置的
java.util.function.Consumer<Float>作为方法入参,不需要额外编写自定义接口 - 实现
retrieveCallback方法:将传入的回调实例赋值给类的成员变量,在run方法完成求和计算后,判断回调存在时主动调用,将sum值传递给外部逻辑。
完整可运行代码
import java.util.function.Consumer; class RandomSum implements Runnable { // 存储外部传入的回调实例 private Consumer<Float> sumCallback; // 实现retrieveCallback方法,入参为Consumer类型,可直接接收Lambda表达式 public void retrieveCallback(Consumer<Float> callback) { this.sumCallback = callback; } @Override public void run() { float sum = 0; for (int i = 0; i < 1000000; i++) { sum += Math.random(); } // 计算完成后触发回调,将结果传递给外部逻辑 if (sumCallback != null) { sumCallback.accept(sum); } } }
正确调用示例
public class Demo { public static void main(String[] args) { RandomSum s = new RandomSum(); // 传入Lambda作为回调逻辑 s.retrieveCallback((sum) -> { System.out.println(sum); }); // 修正启动逻辑:将RandomSum实例传入Thread构造器 Thread thread = new Thread(s); thread.start(); } }
如果不想使用JDK内置的
Consumer接口,也可以自行定义仅含单个抽象方法的函数式接口作为入参类型,只要方法签名和Lambda的参数、返回值匹配,效果完全一致。示例自定义接口写法:@FunctionalInterface interface SumCallback { void onSumCalculated(float result); }
内容的提问来源于stack exchange,提问作者Dimitrios Desyllas
相关产品推荐
相关产品推荐

