Лямбда и Бегущий - PullRequest
       3

Лямбда и Бегущий

0 голосов
/ 01 сентября 2018

Мое понимание было то, что выражение Lambda используется для замены основного кода вокруг абстрактной реализации. Так что, если мне нужно создать новый поток, который принимает интерфейс Runnable (функциональный), мне не нужно создавать новый класс Anonymous, затем предоставлять void run () и затем писать мою логику внутри него скорее, можно просто использовать лямбду и указать ее методу при условии, что сигнатура метода такая же, как и в run, т.е. ничего не берет, ничего не возвращает.

Однако я не мог понять реализацию ниже

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

public static void printStudent(Student stud) {
        System.out.println("Student is "+ stud);
    }

В вышеприведенном случае printStudent принимает аргумент (не как метод run () для runnable), хотя каким-то образом он работает.

Как это работает?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Следующий код (перенос / изменение вашего кода в классе):

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

Обратите внимание, что в первом примере вы должны использовать лямбду (->). Однако вы не сможете использовать ссылку на метод, поскольку метод 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()
};
0 голосов
/ 01 сентября 2018

Вы не передаете параметр методу run(), это часть () ->, которая представляет метод run(). То, что вы делаете, просто определяя метод как:

 @Override
 public void run(){
      printStudent(stud); //the value of stud from the context copied here
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...