Lambdas和Runnable

时间:2018-09-01 09:32:19

标签: java lambda

我的理解是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()方法),尽管它以某种方式起作用。

这是如何工作的?

2 个答案:

答案 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(->)。但是,您将无法使用方法引用,因为方法printItemRunnable的签名不匹配。这将是非法的:

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