Как элегантно создать функцию, которая возвращает лямбда-значение или ничего? - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу написать функцию более высокого порядка в 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, я не понимаюне вижу как.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Есть ли лучший способ без перегрузки?

Нет.

Лучшее, что вы можете сделать, - это избежать дублирования при перегрузках, вызвав Supplierперегрузка от Runnable перегрузки:

private static void test(Runnable r) {
  test(() -> { r.run(); return null; });
}
0 голосов
/ 29 ноября 2018

Вы можете принять Поставщика и предоставить другой способ упаковки Runnable:

Supplier<?> wrap(Runnable r) {
    return () -> {
        r.run();
        return null;
    };
}
...