【问题标题】:How to direct lambda expression to execute a particular method in a class如何指导 lambda 表达式执行类中的特定方法
【发布时间】:2017-03-18 07:12:33
【问题描述】:

我有一个运行器类,它在重载方法中采用 Runnables 或 Callables。

class MyController {
  public void run(Runnable command) {
  }

  public void run(Callable command) {
  }
}

其他需要执行run方法的类做

controllerInstance.run(() -> {...});

基于 lambda 表达式的代码如何确定调用 run(Runnable) 还是 run(Callable) ?有没有办法改变这个默认行为?

【问题讨论】:

  • 我建议通过重命名第二种方法 call() 来明确说明。有一些方法可以让它与命名的方法一起工作(如下面的答案所示),但它们都倾向于导致代码不太优雅。

标签: java lambda


【解决方案1】:

假设你指的是java.lang.Runnablejava.util.concurrent.Callable,如果你返回一个值,它匹配Callable,如果它没有返回一个值,它匹配Runnable,所以没有额外的限定需要。

controllerInstance.run(() -> { /*no return*/ }); // calls run(Runnable command)
controllerInstance.run(() -> { return null; });  // calls run(Callable command)

但是,如果需要,您可以通过强制转换来强制解决问题。

controllerInstance.run((Runnable) () -> { /*no return*/ }); // calls run(Runnable command)
controllerInstance.run((Callable) () -> { return null; });  // calls run(Callable command)

【讨论】:

    【解决方案2】:

    您可以使用转换表达式“标记”一个 lambda,这将指示它应该实现哪些接口。例如:

    controllerInstance.run((Runnable) () -> {...});
    

    只要注意Callable实际上有返回值,而Runnable没有,哪个方法解析考虑在内。我发现只要 lambda 主体的块或表达式确实返回一个值,就会使用 Callable 重载。如果调用确实不明确,则会出现错误并可以使用显式强制转换。

    【讨论】:

      【解决方案3】:

      方法签名决定了您需要哪种类型的 lambda。 因此,当返回 void 时,lambda 方法与 Runnable 接口匹配。 当返回一个 Object 时,lambda 方法与 Callable 接口匹配。

      import java.util.concurrent.Callable;
      
      class MyController {
        public void run(Runnable command) {
          System.out.println("Runnable");
      
        }
      
        public void run(Callable command) {
          System.out.println("Callable");
        }
      
        public static void main(String [] args) {
          MyController myController = new MyController();
      
          myController.run(() -> { return "String"; }  );
          myController.run(() -> {});
        }
      }
      

      这会返回:

      Callable
      Runnable
      

      【讨论】:

      • 所以你对“如何指导 lambda”的回答是不使用 lambda?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多