如何将其作为辅助函数包装?

Lub*_*bor 6 java lambda function java-8

假设我有这样的代码片段:

try {
   // code I need to wrap to be a helper
   long t0 = System.nanoTime();
   obj.doSomething();   // a void function
   long t1 = System.nanoTime();
   Logger.info("doSomthing takes {} nanoseconds", t1-t0);
}  catch (IOException ex) {
   Logger.error("something wrong happened");
}



// another code 

try {
    long t0 = System.nanoTime();
    obj.doAnotherThing();   // void function 
    long t1 = System.nanoTime();
    Logger.info("doSomthing takes {} nanoseconds", t1-t0);
}  catch (IOException ex) {
   Logger.error("something wrong happened");
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题实际上是如何将该void函数作为参数传递给辅助函数,以便我可以避免冗余代码来测量函数的执行时间.


跟进:如果doSomething可以抛出IOException怎么办?

在这种情况下,如果我不想在labmda中捕获异常,我应该如何调用lambda世界中的函数.

谢谢

Jac*_* G. 6

你可以使用Runnable:

public void timeThis(Runnable runnable) {
    long t0 = System.nanoTime();
    runnable.run();
    long t1 = System.nanoTime();
    Logger.info("Execution took {} nanoseconds", t1 - t0);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将要运行的函数作为参数传递给timeThis:

timeThis(() -> obj.doSomething());
Run Code Online (Sandbox Code Playgroud)

如果obj.doSomething()碰巧抛出IOException下面提到的那样,你可以简单地在以下内容中捕获它Runnable:

timeThis(() -> {
    try {
        obj.doSomething();
    } catch (IOException e) {
        e.printStackTrace();
    }
});
Run Code Online (Sandbox Code Playgroud)

注意:这不是一个合适的基准.请参阅:如何在Java中编写正确的微基准测试?


小智 -3

尝试使用 Java 反射方法。 https://docs.oracle.com/javase/tutorial/reflect/member/methodInitation.html 包装函数可以将 Method 作为输入,其中 Method 值在调用者中初始化。在包装函数中使用 invoke 来调用传递的方法。

  • 为此使用反射是糟糕的软件设计。 (6认同)