Java 8 中的功能接口(方法执行时间记录器)
Functional Interfaces in Java 8 (Method execution time logger)
我有两个方法:
class C1
{
void m1() {//does sth}
void m2(int x1, int x2) {//does sth}
}
//记录任何方法所花费的时间
logMethodExecTime(m1);
logMethodExecTime(m2);
不确定如何使用 JDK8 功能接口和方法引用来为方法 'logMethodExecTime' 定义正确的语法?
以下无效:
class Utils
{
public static void logMethodExecTime(Supplier<Void> s)
{
long start = System.nanoTime();
s.get();
long end = System.nanoTime();
System.out.println(((end-start)/1000000000d) + " secs");
}
}
和调用:
C1 c = new C1();
Utils.logMethodExecTime(c::m1);
//Also how can we have one single definition of 'logMethodExecTime'
//to accept any method with any number of args
Utils.logMethodExecTime(c::m2);
您应该使用普通的 Runnable
而不是 Supplier<Void>
,而不是坚持方法引用,您需要一个包含方法调用的显式 lambda,捕获它需要的任何参数。例如:
logMethodExecTime(() -> m2(17, 37));
请注意,lambda 不一定只是单个方法调用。这使您可以更灵活地测量内容。
我有两个方法:
class C1
{
void m1() {//does sth}
void m2(int x1, int x2) {//does sth}
}
//记录任何方法所花费的时间
logMethodExecTime(m1);
logMethodExecTime(m2);
不确定如何使用 JDK8 功能接口和方法引用来为方法 'logMethodExecTime' 定义正确的语法?
以下无效:
class Utils
{
public static void logMethodExecTime(Supplier<Void> s)
{
long start = System.nanoTime();
s.get();
long end = System.nanoTime();
System.out.println(((end-start)/1000000000d) + " secs");
}
}
和调用:
C1 c = new C1();
Utils.logMethodExecTime(c::m1);
//Also how can we have one single definition of 'logMethodExecTime'
//to accept any method with any number of args
Utils.logMethodExecTime(c::m2);
您应该使用普通的 Runnable
而不是 Supplier<Void>
,而不是坚持方法引用,您需要一个包含方法调用的显式 lambda,捕获它需要的任何参数。例如:
logMethodExecTime(() -> m2(17, 37));
请注意,lambda 不一定只是单个方法调用。这使您可以更灵活地测量内容。