3

私には2つの方法があります:

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);
4

1 に答える 1

10

Supplier<Void>プレーンを使用する代わりRunnableに、メソッド参照を主張する代わりに、メソッド呼び出しを含み、必要な引数をキャプチャする明示的なラムダが必要になります。例えば:

logMethodExecTime(() -> m2(17, 37));

ラムダは必ずしも単一のメソッド呼び出しではないことに注意してください。これにより、測定対象の柔軟性が高まります。

于 2015-03-15T20:26:47.900 に答える