Лямбда-перевод - это двухэтапный процесс, Один: дезауринг лямбда в статический метод в том же классе.
public class Main {
public static void main(String[] args) {
Runnable r = () -> System.out.println("Hello");
System.out.println(Arrays.asList(Main.class.getDeclaredMethods()));
}
}
[ private static void Main.lambda $main $0(), public static void Main.main(java.lang.String [])]
Два: генерация класса, реализующего функциональный интерфейс.
System.out.println("A class has been generated: " + r.getClass());
System.out.println("That implements a Functional Interface: " + Arrays.asList(r.getClass().getInterfaces()));
Создан класс: class Main $$ Lambda $1/149928006
Это реализует функциональный интерфейс: [interface java.lang.Runnable]
Вопрос: Какая потребность в этом статическом методе? Почему тело лямбда не может быть помещено непосредственно в метод интерфейса? Что-то вроде:
class Main$$Lambda$1 {
public void run() {
/* Lambda body here */
}
}