【问题标题】:How to use returned Lambda expression in Java?如何在 Java 中使用返回的 Lambda 表达式?
【发布时间】:2022-12-09 16:43:12
【问题描述】:

我目前正在学习 Java,我看到一些代码如下所示:

public interface Await {
     boolean await(long timeout, TimeUnit timeUnit) throw InterruptedException
}
public Await spinServerUp() {
    this.startServers()
    return (timeout, timeUnit) -> countDownLatch.await(timeout, timeUnit);
}

现在我明白 countDownLatch 在继续之前等待线程完成。

我的问题是 - 参数 timeouttimeunit 如何传递给 Lambda 表达式?对于我正在阅读的这段代码,我找不到任何使用示例,所以我有点困惑。

我也不确定我是否很好地遵循 spinServerUp() 方法,我知道它调用 this.startServers() 然后返回 Lambda 表达式 - 从而控制 Lambda 表达式。为什么要返回 Lambda 表达式呢?

我试着在我这边做一些阅读,但我变得更加困惑。任何其他阅读材料或对我的两个问题的解释都会非常有帮助!

【问题讨论】:

  • 也许你会发现 this 有用

标签: java


【解决方案1】:

参数 timeout 和 timeunit 如何传递给 Lambda 表达式?

只需将 returnValue 视为一个函数即可。与您在课堂上声明的功能基本相同:

Await await = spinServerUp();
await.await(3, TimeUnit.SECONDS);

为什么要返回 Lambda 表达式呢?

Lambda 函数声明在您像上面的代码 sn-p 那样调用它时什么都不做。

【讨论】:

    【解决方案2】:

    既然你有一个实现功能接口Await 采用spinServerUp() 方法的形式,在任何需要Await 实例的地方,您都可以使用方法参考intance_name::spinServerUp()(其中intance_name 是对拥有方法spinServerUp() 的类实例的引用)。

    【讨论】:

      【解决方案3】:

      您可以使用 lamda 调用 await 函数:

      try {
       if (spinServerUp().await(1, MINUTES)) {
         // do stuff
       }
      } catch (InterruptedException e) {
       Thread.currentThread().interrupt();
      // just exit on interruption?
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-19
        • 1970-01-01
        • 2018-10-09
        • 2016-05-30
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        相关资源
        最近更新 更多