替换匿名 new Runnable() 的 lambda 是如何工作的?

How does a lambda replacing an Anonymous new Runnable() work?

当你写一个匿名的Runnable比如:

Thread producer = new Thread(new Runnable() {
      @Override
      public void run() {
        // do something
      }
});

IntelliJ 建议将其替换为以下 lambda:

Thread producer = new Thread(() -> {
       // do something
    }
});

效果一样好。

这究竟是如何工作的?特别是:

  1. 使用的构造函数仍然是 Thread(Runnable target),但 lambda 中没有任何内容表明它是一个 Runnable。
  2. 为什么 @Override public void run() 突然不再需要了?

如果您的匿名 class 只有一种方法,您可以将其实现为 lambda 表达式。您在此处作为 lambda 传递的是 run 方法的实现。 Lambda 表达式让您可以更紧凑地表达单一方法 classes 的实例。