2016-10-09 1 views
0

Runnableインターフェイスを使用して必要な関数をラップアラウンドするだけで、関数の時刻を設定しようとしています。Java Lambda Expression(非最終関数パラメータあり)

double durationOfFunctionB = time(() -> functionB(someParameter)); 

問題I:私は、パラメータをとる関数を持っている場合は、それがに修正されなければならない、しかし

double durationOfFunctionA = time(Driver::functionA); // functionA belongs in class Driver 

private static double time(Runnable runnable) { // returns how long runnable took 
    long startTime = System.nanoTime(); 
    runnable.run(); 
    return (System.nanoTime() - startTime)/1000000000.0; 
} 

その後、私は単純に次のことを行うことができます「someParameter」は最終的に、または効果的に最終的でなければならないということです。この問題を回避する方法はありますか?私はforEachでループを見ましたが、条件が満たされるまでこのパラメータを1,10,100から指数関数にする必要があります。このコードは次のとおりです:

public static void main(String[] args) { 
    double timer = 0; 
    int size = 1; 

    while(timer <= 10) { 
     timer = time(() -> functionB(size)); 
     size *= 10; 
    } 
} 

私は複雑さ/ big-Oをテストしたいので、functionBはパラメータを取り込む必要があります。私はラムダ式を正しい方法でコーディング/使用していないと心配しています。誰かがこの問題を解決するのに役立ち、別の解決策を見つけることができれば、それは感謝します。

私はこれをRunnableインターフェイスと非常に複雑にする必要はないことを知っています。私はちょうどwhileループでタイミングを正しく行うことができます。しかし、このようなことができるかどうかを見てみたかったので、テストするための関数と構文的な砂糖を入力するだけでした。

答えて

1

あなたは、単にこのように、最終的な変数を分離するために変数の値をコピーすることができます。

double timer = 0; 
int size = 0; 
while(true) { 
    final finalSize = size; 
    timer = time(() -> functionB(finalSize)); 
    size *= 10; 
} 

また、私はあなたが時間にしたい関数のパラメータの様々な量のためのいくつかのより多くのタイミング機能を作るためにあなたをアドバイスすることができます。 ここでそれを行うには:

public class Test { 

    public static void main(final String[] args) { 
     int ttt = 0; 
     time(ttt, Test::func); 
     time(ttt, ttt, Test::func); 
    } 

    public static void func(int i) { 

    } 

    public static void func(int i, int j) { 

    } 

    public static <T> double time(T arg, Consumer<T> func) { 
     long startTime = System.nanoTime(); 
     func.accept(arg); 
     return (System.nanoTime() - startTime)/1000000000.0; 
    } 

    public static <T1, T2> double time(T1 arg1, T2 arg2, BiConsumer<T1, T2> func) { 
     long startTime = System.nanoTime(); 
     func.accept(arg1, arg2); 
     return (System.nanoTime() - startTime)/1000000000.0; 
    } 

} 
1

これを試してみてください。

public static void main(String[] args) { 
    double timer = 0; 
    final int[] size = {1}; 

    while(timer <= 10) { 
     timer = time(() -> functionB(size[0])); 
     size[0] *= 10; 
    } 
} 

ラムダ式は、フリー変数を内部でコピーすることによって参照されます。 フリーの商品は変更しないでください(final)。 しかし、size[0]を渡すと、ラムダ式は配列変数sizeをコピーします。 finalです。

+1

お試しください...説明を追加しますか? – GhostCat

+0

助けてくれてありがとう!私はこれは配列が最終的なものだと仮定していますが、実際の内容は柔軟性がありますか? –

関連する問題