Я хочу написать функцию более высокого порядка в Java, которая принимает лямбду и возвращает возвращаемое значение labmda или ничего не возвращает, если лямбда не имеет возвращаемого типа.
In 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
}
}
Мне пришлось перегружать test
, давая ему Supplier<T>
, когда я хочу вернуть возвращаемое значение лямбды и Runnable
если лямбда ничего не возвращает.
Есть ли лучший способ без перегрузки?
Так как void
(но Void
может) не может заменить T
, я не понимаюне вижу как.