gpt4 book ai didi

具有非最终函数参数的 Java Lambda 表达式

转载 作者:行者123 更新时间:2023-11-29 04:39:15 25 4
gpt4 key购买 nike

我试图通过使用 Runnable 接口(interface)环绕我需要的任何函数来简单地为函数计时。

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

然后我可以简单地执行以下操作:

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

但是,如果我有一个带参数的函数,则必须将其修改为:

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

我遇到的问题是“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;
}
}

我要求 functionB 接受一个参数,因为我想测试它的复杂性/big-O。我担心我没有以正确的方式编码/使用 lambda 表达式。如果有人可以帮助解决这个问题或找到其他解决方案,我们将不胜感激。

作为旁注,我确实知道我不必使用 Runnable 接口(interface)使它变得如此复杂,我可以直接在 while 循环中进行计时。然而,我只是想看看是否有可能做这样的事情,这样我就可以输入一些函数来测试,并作为语法糖。

最佳答案

您可以像这样简单地将变量值复制到单独的最终变量:

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;
}

}

关于具有非最终函数参数的 Java Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39940323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com