gpt4 book ai didi

java - Lambda:声明通用类型内联

转载 作者:行者123 更新时间:2023-11-30 06:17:10 27 4
gpt4 key购买 nike

我的目标

我想写一个通用的计时函数(我删除了这个问题的实际计时代码,因为它并不重要)。

我有一个输入和输出未知的函数。我想在一个循环中运行这个函数几次,并将循环变量传递给它。

为此,我定义了一个接口(interface),可以将循环变量转换为函数需要的类型。

我的代码

interface Function<R,T> {
R run(T input);
}

interface InputGenerater<T> {
T fromLoop(int i);
}

public static void time(Function func, InputGenerater in) {
for (int i = 0; i < 10; i++) {
func.run(in.fromLoop(i));
}
}

public static void main(String[] args) {
// example: my function expects a string, so we transform the loop variable to a string:
InputGenerater<String> intToString = (int i) -> String.valueOf(i) + "test";

Function<String, String> funcToTest = (String s) -> s + s;
time(funcToTest, intToString);

Function<String, String> funcToTest2 = (String s) -> s + s + s;
time(funcToTest2, intToString);

// I can not only test string->string functions, but anything I want:
InputGenerater<Integer> intToInt = (int i) -> i;
Function<Integer, Integer> funcToTestInt = (Integer i) -> i + i;
time(funcToTestInt, intToInt);
}

我的问题

上面的代码工作正常,但我不希望有 funcToTest等变量,因为它们只在一行中使用。

所以我希望 main 方法看起来像这样:

    InputGenerater<String> intToString = (int i) -> String.valueOf(i) + "test";

time((String s) -> s + s, intToString);
time((String s) -> s + s + s, intToString);

InputGenerater<Integer> intToInt = (int i) -> i;
time((Integer i) -> i + i, intToInt);

但它不起作用:Incompatible types in lambda expression .

有没有办法声明内联参数类型,而不是通过声明 Function<String, String> 来声明它?变量?

最佳答案

您在时间函数中使用原始类型:您应该使用泛型,您的代码将按预期编译:

public static <R, T> void time(Function<R, T> func, InputGenerater<T> in)

另请注意,您定义的Function 接口(interface)already exists in the JDK (它的方法是 apply 而不是 run)并且 InputGenerator 也存在并且 is called IntFunction .

因此,摆脱这些接口(interface)并改用 JDK 提供的接口(interface)是有意义的。

所以最终版本可能是这样的:

public static <R, T> void time(Function<R, T> func, IntFunction<T> in) { ... }

还有你的主要方法:

time(s -> s + s, i -> i + "test"); //s is a string
time(i -> i + i, i -> i); //i is an int

关于java - Lambda:声明通用类型内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26119099/

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