我的理解是Lambda的表达式用于替换抽象实现周围的锅炉代码。 因此,如果我必须创建一个需要Runnable接口(功能性)的新线程, 我不必创建一个新的Anonymous类,然后提供void run()然后在其中写入我的逻辑 而是可以简单地使用lambda并将其指向方法,只要方法签名与运行相同即可,即不执行任何操作,不返回任何内容。
但是我不明白下面的实现方式
Thread t= new Thread(()->printStudent(stud));
public static void printStudent(Student stud) {
System.out.println("Student is "+ stud);
}
在上述情况下,printStudent接受了一个参数(不像runnable的run()方法),尽管它以某种方式起作用。
这是如何工作的?
答案 0 :(得分:0)
您没有将参数传递给run()
方法,它是代表() ->
方法的run()
部分。您正在做什么,只需将方法定义为:
@Override
public void run(){
printStudent(stud); //the value of stud from the context copied here
}
答案 1 :(得分:0)
以下代码(在类中包装/修改您的代码):
public class Main {
public static void main(String[] args) {
String item = "Hello, World!"
Thread t = new Thread(() -> printItem(item));
t.start();
}
public static void printItem(Object item) {
System.out.println(item);
}
}
在功能上等同于:
public class Main {
public static void main(String[] args) {
String item = "Hello, World!"
Thread t = new Thread(new Runnable() {
@Override
public void run() {
printItem(item);
}
});
t.start();
}
public static void printItem(Object item) {
System.out.println(item);
}
}
请注意,在第一个示例中,您必须使用lambda(->
)。但是,您将无法使用方法引用,因为方法printItem
与Runnable
的签名不匹配。这将是非法的:
Thread t = new Thread(Main::printItem);
基本上,方法引用与以下内容相同:
new Runnable() {
@Override
public void run() {
printItem(); // wouldn't compile because the method has parameters
}
}
->
之后的表达式或-> {}
块中的代码与您在run()
方法中放入的代码相同。
Runnable singleExpression = () -> /* this is the code inside run()*/;
Runnable codeBlock = () -> {
// this is the code inside run()
};