如何优雅地创建一个返回lambda返回值或什么都不返回的函数?

时间:2018-11-29 19:08:48

标签: java generics lambda kotlin return-type

我想用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,所以我不知道如何。

2 个答案:

答案 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;
    };
}