Java 如何将方法作为参数传递及性能测量实践
在实际开发中,我们经常需要统计某些方法的执行耗时。如果每次都要复制粘贴计时代码,不仅繁琐,还容易出错。这时候大家自然会想到:能不能直接把方法当作参数传进去呢?
核心概念
严格来说,Java 中的方法(Method)并不是像 JavaScript 那样的'一等公民',不能直接像函数指针那样传递。不过,我们可以通过接口封装来实现类似的效果。
传统方案:使用 Runnable
最经典的做法是定义一个接收 Runnable 接口的工具方法。你需要把要计时的逻辑包装在一个匿名类或者 Lambda 表达式中。
private void measureExecutionTime(Runnable task) {
long startTime = System.nanoTime();
try {
task.run();
} finally {
long endTime = System.nanoTime();
System.out.println("耗时:" + (endTime - startTime) + " ns");
}
}
调用时,可以这样写:
measureExecutionTime(new Runnable() {
public void run() {
myMethod();
}
});
现代写法:Lambda 与函数式接口
如果你使用的是 Java 8 及以上版本,代码会更简洁。利用 Lambda 表达式,我们可以省略 new Runnable() 的部分。
// 假设有一个待测方法
public void myMethod() {
// 业务逻辑
}
// 直接传入 Lambda
measureExecutionTime(() -> myMethod());
甚至可以直接使用方法引用(Method Reference),前提是目标方法没有参数且返回 void:
measureExecutionTime(this::myMethod);
注意事项
- 异常处理:上面的示例使用了
try-finally结构,确保无论任务是否抛出异常,都能记录结束时间。实际项目中建议根据需求调整异常捕获策略。

