为了账号安全,请及时绑定邮箱和手机立即绑定

Lambda 和 Runnable

Lambda 和 Runnable

牛魔王的故事 2021-08-25 15:11:44
我的理解是 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() 方法),尽管它以某种方式工作。这是如何工作的?
查看完整描述

2 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

以下代码(在类中包装/修改您的代码):


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()

};


查看完整回答
反对 回复 2021-08-25
?
白衣非少年

TA贡献1155条经验 获得超0个赞

您没有将参数传递给run()方法,它() ->是代表run()方法的部分。你在做什么只是将方法定义为:


 @Override

 public void run(){

      printStudent(stud); //the value of stud from the context copied here

 }


查看完整回答
反对 回复 2021-08-25
  • 2 回答
  • 0 关注
  • 206 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信