猿问

Lambda 和 Runnable

我的理解是 Lambda 的表达式用于替换围绕抽象实现的锅炉板代码。因此,如果我必须创建一个采用 Runnable 接口(Functional)的新线程,我不必创建一个新的匿名类,然后提供 void run() 然后在其中编写我的逻辑,而可以简单地使用 lambda 并指向如果方法签名与 run 相同,即不接受任何内容,不返回任何内容,则将其传递给一个方法。


但是我无法理解下面的实现


Thread t= new Thread(()->printStudent(stud));


public static void printStudent(Student stud) {

        System.out.println("Student is "+ stud);

    }

在上述情况下,printStudent 接受一个参数(不像 runnable 的 run() 方法),尽管它以某种方式工作。


这是如何工作的?


牛魔王的故事
浏览 207回答 2
2回答

绝地无双

以下代码(在类中包装/修改您的代码):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()};

白衣非少年

您没有将参数传递给run()方法,它() ->是代表run()方法的部分。你在做什么只是将方法定义为: @Override public void run(){      printStudent(stud); //the value of stud from the context copied here }
随时随地看视频慕课网APP

相关分类

Java
我要回答