dad*_*off 4 java generics lambda void
我正在尝试编写一个通用的性能日志记录函数,我可以传递任何方法来定时,它会将执行时间记录到我的数据库中.我在大多数情况下都有这个工作,但在传递返回的方法时遇到编译器错误void:
no instance(s) of type variable(s) T exist so that void conforms to T
Run Code Online (Sandbox Code Playgroud)
这是我的班级:
public class Performance {
public static <T> T measureExecTime(Callable<T> c, String gid, String name) {
T call = null;
try {
if (Constants.DEBUG) {
Calendar start = Calendar.getInstance();
call = c.call();
Calendar end = Calendar.getInstance();
long diff = end.getTimeInMillis() - start.getTimeInMillis();
// log diff to database
} else {
call = c.call();
}
} catch (Exception e) {
e.printStackTrace();
}
return call;
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我如何称呼它:
Performance.measureExecTime(() -> myMethod(myMethodParam1, myMethodParam2), "gid", "database_qualifier");
Run Code Online (Sandbox Code Playgroud)
这个功能是否可以在void方法上运行,或者我运气不好?
Callable必须有一个返回值.在这种情况下,您只需返回null,但您需要一个块lambda:
Performance.measureExecTime(() -> {
myMethod(myMethodParam1, myMethodParam2);
return null;
}, "gid", "database_qualifier");
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以创建一个帮助方法,使事情变得更清洁:
static Callable<?> wrap(Runnable r) {
return () -> {
r.run();
return null;
};
}
// ...
Performance.measureExecTime(wrap(() -> myMethod(myMethodParam1, myMethodParam2)), "gid", "database_qualifier");
Run Code Online (Sandbox Code Playgroud)