Callable是函数式接口,因其仅含一个抽象方法call(),返回泛型值且声明throws Exception;故天然支持Lambda表达式和方法引用,可直接用于ExecutorService提交异步任务并获取Future结果。

Callable 本身就是一个函数式接口,所以它天然支持 Lambda 表达式和方法引用,无需额外“结合”——直接用就行。
为什么 Callable 是函数式接口?
因为 Callable 只有一个抽象方法:call(),返回泛型结果且可抛出异常。这完全符合函数式接口定义(仅一个抽象方法的接口)。
它的声明是:
public interface Callable用 Lambda 直接实现 Callable
不用写单独的类或匿名内部类,一行搞定:
立即学习“Java免费学习笔记(深入)”;
- Callable
task = () -> { Thread.sleep(1000); return "done"; }; - 注意:Lambda 体里可以写多条语句(用大括号),但必须有
return,且类型要匹配泛型V。 - 异常处理需在调用处捕获(
call()声明抛Exception,但 Lambda 本身不强制 try-catch;实际执行时若抛出受检异常,仍需由上层处理)。
用方法引用简化已有逻辑
如果已有返回值的方法,且签名兼容(无参、返回值类型匹配、允许抛 Exception),可直接引用:
- Callable
task = this::computeValue; - 要求
computeValue()是无参方法,返回Integer,且声明抛Exception或只抛运行时异常。 - 常见场景:封装数据库查询、HTTP 调用等耗时操作为 Callable 任务提交给线程池。
配合 ExecutorService 使用最典型
Lambda 写的 Callable 可直接提交执行并获取 Future:
- ExecutorService es = Executors.newSingleThreadExecutor();
- Future
future = es.submit(() -> "hello from callable"); - String result = future.get(); // 阻塞获取结果
这是异步获取带返回值任务结果的标准方式,比 Runnable 更实用。


















