Пожалуйста, объясните синтаксис методов лямбда Java 8.
Есть много объяснений там, для каких функций лямбда есть, но я не могу найти подробное объяснение синтаксиса, и мне очень трудно научиться правильно воспроизводить синтаксис, потому что я не понимаю почему они написаны так, как они есть.
Вот общий случай, с которым я сталкиваюсь, любезно предоставил NetBeans:
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new MainAppJFrame();
});
}
Итак, каким-то образом следующее лямбда-выражение разрешается в анонимный метод Runnable
object run():
() -> {
// do stuff
}
->
- собственно синтаксис лямбда, правильно? А фигурные скобки просто содержат код анонимного метода. Являются ли круглые скобки пустым аргументом, потому что в этом случае мы создаем метод Runnable.run()
?
Это все довольно неясно для меня. Я предполагаю, что компилятор знает, как создать анонимный Runnable
на основе типа, ожидаемого методом SwingUtilities.invokeLater(Runnable)
? Что произойдет, если будут два метода SwingUtilities.invokeLater
, которые отличаются только списком параметров? Очевидно, что в этом конкретном случае нет, но это возможно в другом месте:
interface ExampleLambdaConsumer {
public void doSomething(Runnable r);
public void doSomething(java.lang.reflect.Method m);
}
class C implements ExampleLambdaConsumer {
// implementations for doSomething methods here
public static void main(String[] args) {
doSomething(() -> {
// lambda method body here
}
}
}