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

标签 java function lambda 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");
}

所以我的问题实际上是如何将 void 函数作为参数传递给辅助函数,这样我就可以避免用于测量函数执行时间的冗余代码。


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

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

谢谢

最佳答案

您可以使用Runnable:

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

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

timeThis(() -> obj.doSomething());

如果 obj.doSomething() 恰好抛出一个 IOException 就像您在下面提到的那样,您可以简单地在 Runnable 的主体中捕获它>:

timeThis(() -> {
    try {
        obj.doSomething();
    } catch (IOException e) {
        e.printStackTrace();
    }
});

注意:这不是一个合适的基准。请参阅:How do I write a correct micro-benchmark in Java?

关于java - 如何将其包装为辅助函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49682124/

相关文章:

C++ - 使用迁移的数据库模式

java - 基于EditText输入实现Android TextView的textMultiline

java - EJB 3 中的@Local 注释

javascript - 不能在括号中使用变量只能直接输入将dms转换为dd

javascript - 使用 JavaScript 转到页面并自动执行该页面上的功能

scala - 在 Scala 中,如何传递具有多个参数列表的函数作为参数?

c++ - WRL : how to subscribe to events *without* using lambdas?

java - jqassistant 报告生成失败,Maven 站点

java - 私有(private)类中的可见性修饰符有什么区别?

C# Lambda+Extensions+Fluent - 我该怎么做?