gpt4 book ai didi

lambda - 为什么可以在 Thread 类中使用 Lambda 表达式?

转载 作者:行者123 更新时间:2023-12-04 19:05:55 25 4
gpt4 key购买 nike

我正在学习 Lambda 表达式,我知道可以在 Runnable 功能接口(interface)和 Thread 类中使用它们。

我试图创建自己的:

package tests;

public interface Blabla
{
public void doStuff();
}

这个简单的测试编译:
Blabla bla = () -> System.out.println("Lol");

然后我尝试制作一个像 Thread 这样的类
package tests;

public class Dodo implements Blabla
{
public void doStuff()
{
// TODO Auto-generated method stub

}
}

这不编译:
 Dodo dodo = () -> System.out.println("LoL");

而且我找不到任何地方解释如何创建一个允许使用 lambda 表达式的类。

Thread 如何在不是接口(interface)的情况下允许使用 Lambda 表达式?

最佳答案

How can Thread allow the use of Lambda Expressions while not being an Interface?



我认为您对 Thread 类如何使用 lambdas 有点困惑。 lambda 不会转换为 Thread 类本身的实例;相反,lambda 被转换为 Runnable 功能接口(interface)的子类的实例,然后将其传递给已为 overloaded to take a Runnable object 的 Thread 构造函数.

因此,当您执行以下操作时:
new Thread(() -> System.out.println("Lol")).start();

lambda 未转换为您正在创建的 Thread 对象。相反,它被转换为传递给 Thread 构造函数的 Runnable 对象。

如果将 lambda 与 Thread 对象分开,这会更清楚:
Runnable temp = () -> System.out.println("Lol");

new Thread(temp).start();

考虑一个线程执行一个函数而不是一个函数可能会有所帮助。您必须保持线程正在执行的功能与线程本身不同。

请注意,将 lambda 转换为对象的方式是一个实现细节,并且在 future 的 Java 版本中可能会发生变化(Java 1.8.0_11 是编写此答案时的最新版本)。请参阅下面的 Stuart Marks 评论。

And I cant find anywhere explaining how to create a class which allows the use of lambda expressions.



如果我对您的理解正确,您希望编写一个类,以便您可以基于该类创建一个 lambda。

不幸的是,你不能。查看 Java 语言规范,第 15.27 节:

Evaluation of a lambda expression produces an instance of a functional interface (§9.8).



这里的关键点是 lambda 是一个接口(interface)的实例。因此,您不能使用 lambda 直接子类化一个类。这样做的理由可以在 this 中找到。 Brian Goetz 在 JDK lambda-dev 邮件列表中的电子邮件(感谢 Stuart Marks 指出这一点!);简而言之,该决定至少是部分做出的,因此 Java 可以继续朝着新的方向发展。

你可以做的是编写一个类,它的构造函数和/或方法将一个或多个函数接口(interface)作为参数,让你通过传递函数接口(interface)的实例来使用带有 lambdas 的类(如 Thread 类) .目前(据我所知),这已经非常好。

关于lambda - 为什么可以在 Thread 类中使用 Lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24847032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com