【问题标题】:How to elegantly create a function which returns a lambda's return value or nothing?如何优雅地创建一个返回 lambda 的返回值或什么都不返回的函数?
【发布时间】: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&lt;T&gt;,如果 lambda 没有返回任何东西,我必须给它一个 Runnable

有没有更好的方法不重载?

由于void(但Void 可以)不能代替T,我不知道该怎么做。

【问题讨论】:

  • "有没有更好的方法不重载?"是否需要更好的方法?
  • @AndyTurner 我对比了它在 Kotlin 中的简洁程度。所以,简而言之:是的,这会很好。

标签: java generics lambda kotlin return-type


【解决方案1】:

有没有更好的方法不重载?

没有。

您可以做的最好的事情是通过从Runnable 重载中调用Supplier 重载来避免重载中的重复:

private static void test(Runnable r) {
  test(() -> { r.run(); return null; });
}

【讨论】:

    【解决方案2】:

    您可以接受 Supplier 并提供另一种包装 Runnable 的方法:

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

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2010-10-05
      • 2015-09-07
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多