【发布时间】:2018-11-29 19:08:47
【问题描述】:
我想用 Java 编写一个高阶函数,它接受一个 lambda 并返回 labmda 的返回值,或者如果 lambda 没有返回类型,则不返回任何内容。
在 Kotlin 中,我会这样做:
fun <T> test(block: () -> T): T {
val r = block()
// ...
return r
}
由于Unit 将是T,以防没有任何返回,这将起作用。
在 Java 中我只能想到这个:
public class Main {
private static <T> T test(Supplier<T> s) {
T t = s.get();
// ...
return t;
}
private static void test(Runnable r) {
// ...
r.run();
}
public static void main(String args[]) {
test(() -> System.out.println("Hello")); // returns void
test(() -> 5); // return an Int
}
}
当我想返回 lambda 的返回值时,我不得不重载 test 给它一个 Supplier<T>,如果 lambda 没有返回任何东西,我必须给它一个 Runnable。
有没有更好的方法不重载?
由于void(但Void 可以)不能代替T,我不知道该怎么做。
【问题讨论】:
-
"有没有更好的方法不重载?"是否需要更好的方法?
-
@AndyTurner 我对比了它在 Kotlin 中的简洁程度。所以,简而言之:是的,这会很好。
标签: java generics lambda kotlin return-type