Java 8 Пример объема лямбда от leanpub - PullRequest
2 голосов
/ 14 марта 2020

Я пытаюсь прочитать это https://leanpub.com/whatsnewinjava8/read#leanpub -auto-scope , и я немного сбит с толку относительно:

  1. , почему toString () вызывается в Назначение r1
  2. как это демонстрирует область, доступную для лямбды

Ответы [ 3 ]

2 голосов
/ 14 марта 2020

Я могу с уверенностью ответить на первый вопрос:

Когда вы вызываете функцию System.out.println, она сделает следующее:

Печатает объект и затем завершает строку , Этот метод сначала вызывает String.valueOf (x) для получения строкового значения напечатанного объекта, затем ведет себя так, как будто он вызывает print (String), а затем println ().

Источник: https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html#println - java .lang.Object-

И последующий вызов String.valueOf(x) сделает следующее:

Если аргумент нулевой, тогда a строка, равная «нулю»; в противном случае возвращается значение obj.toString ().

Источник: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#valueOf - java .lang.Object-

С this относится к экземпляру Hello, он просто вызовет метод Hello.toString() в данном экземпляре - callstack:

System.out.println(this);
String.valueOf(this);
this.toString();

Второй вопрос, касающийся области действия, вероятно, означает, что вы все равно можете обратиться к методы и поля окружающего класса, но я нахожу этот пример странным, а также не очень хорошо документированным.

0 голосов
/ 14 марта 2020

Всякий раз, когда вы определяете метод toString в классе:

class ArbitaryClass {
     String toString() { System.out.println("Object of ArbitaryClass."); }
}

Затем, когда вы вызываете System.out.println для его экземпляра, запускается метод toString:

System.out.println(new ArbitaryClass()); // Will print Object of ArbitaryClass.

Итак, когда вы пытаетесь запустить new Hello().r1.run(), он просто вызывает out.println(this), ( this ) представление текущего объекта ( new Hello () ) класса, который, в свою очередь, вызовет метод toString и напечатает сообщение «Hello, world!» .

И до тех пор, пока вы вызываете out.println(this) или out.println(toString()) внутри класса, тогда лямбда имеет доступ к его свойствам и методам.

0 голосов
/ 14 марта 2020

В lamdba это относится к классу, объявляющему лямбду, в отличие от анонимного класса, где это относится к анонимному классу.

Например:

 public class Hello {
    Runnable r1 = () -> out.println(this);
    Runnable r2 = new Runnable() {
        @Override
        public void run() {
            out.println(this);
        }
    };

    public String toString() {
        return "Hello, world!";
    }

    public static void main(String... args) {
        new Hello().r1.run(); // Hello, world!
        new Hello().r2.run(); // something like Hello$1@776ec8df
    }
}
...