Ich versuche, eine Funktion einfach zu time-Zeit zu setzen, indem ich die Runnable-Schnittstelle verwende, um die von mir benötigte Funktion umzubrechen.Java-Lambda-Ausdruck mit nicht abschließenden Funktionsparametern
private static double time(Runnable runnable) { // returns how long runnable took
long startTime = System.nanoTime();
runnable.run();
return (System.nanoTime() - startTime)/1000000000.0;
}
dann konnte ich einfach folgendes tun:
double durationOfFunctionA = time(Driver::functionA); // functionA belongs in class Driver
jedoch, wenn ich eine Funktion haben, die einen Parameter annimmt, muss sie geändert werden:
double durationOfFunctionB = time(() -> functionB(someParameter));
Das Problem, das ich Ich bin der Meinung, dass 'someParameter' endgültig oder effektiv sein muss. Gibt es eine Problemumgehung dieses Problem? Ich habe Schleifen mit forEach gesehen, aber ich brauche diesen Parameter exponentiell von 1, 10, 100 -> bis eine Bedingung erfüllt ist. Der Code ist dies:
public static void main(String[] args) {
double timer = 0;
int size = 1;
while(timer <= 10) {
timer = time(() -> functionB(size));
size *= 10;
}
}
I FunktionD erfordern in einem Parameter zu nehmen, weil ich die Komplexität/big-O davon testen möchte. Ich mache mir Sorgen, dass ich Lambda-Ausdrücke nicht korrekt codiere/benutze. Wenn jemand helfen kann, dieses Problem zu lösen oder eine andere Lösung zu finden, würde dies geschätzt werden.
Als eine Randnotiz, ich weiß, dass ich dies mit einer Runnable-Schnittstelle nicht so komplex machen muss, kann ich einfach das Timing direkt in der While-Schleife tun. Ich wollte jedoch nur sehen, ob es möglich ist, so etwas zu tun, also könnte ich einfach eine Funktion zum Testen eingeben und als syntaktischen Zucker.
Probieren Sie ... eine Erklärung hinzufügen? – GhostCat
Danke für die Hilfe! Ich nehme an, dies ist, weil das Array endgültig ist, aber die tatsächlichen Inhalte sind flexibel? –