我想用Java编写一个高阶函数,该函数需要一个lambda并返回labmda的返回值,或者如果lambda没有返回类型则不返回任何内容。
在科特林中,我会做类似的事情:
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
,所以我不知道如何。
答案 0 :(得分:2)
有没有更好的方法而不过载?
否。
您最好的办法是通过从Supplier
重载调用Runnable
重载来避免重载:
private static void test(Runnable r) {
test(() -> { r.run(); return null; });
}
答案 1 :(得分:1)
您可以接受供应商并提供另一种包装Runnable的方法:
Supplier<?> wrap(Runnable r) {
return () -> {
r.run();
return null;
};
}