You need to enable JavaScript to run this app. Java中如何在自定义Runnable类中定义可接收Lambda的回调方法
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 14:45:04