Анонимный класс (Anonymous class), Объявление, Лямбда выражение (Lambda expression)
class Person {
public void speak() {
System.out.println("Я человек!");
}
}
public class Program {
public static void main(String[] args)
{
Person p = new Person() {
public void speak() {
System.out.println("Я анонимный класс!");
}
};
p.speak();
}
}
Как можно объявить анонимный класс через лямбда-выражения? И в каких случаях необходимо объявлять через лямбду, а не через способ какой я указал в примере?
Ответы (2 шт):
Анонимный класс не декларируется в коде как непосредственный java класс (то что вы и делаете в функции main), а создаётся на месте. Например можно реализовать интерфейс Runnable не создавая и не имплементируя (implements) никаких своих классов.
class Executor {
public void execute(Runnable runnable){
runnable.run();
}
}
class NonAnonymousClass implements Runnable {
public void run () {
System.out.println("Привет! Я — НЕ анонимный класс");
}
}
class Main {
public static void main(String[] args) {
Executor executor = new Executor();
executor.execute(new NonAnonymousClass());
executor.execute(new Runnable() {
public void run(){
System.out.println("Привет! Я — анонимный класс");
}
});
executor.execute(()->{
System.out.println("Привет! А я — лямбда!");
});
}
}
Как из одного, получается другое? Что такое функциональный интерфейс? Какая связь между лямбда выражением и анонимным классом? - Под капотом происходят интересные вещи, в зависимости от версии Java, но это темы для отдельных вопросов.
Для начала надо объявить интерфейс для создания анонимного класса
interface Person {
public void speak() {
System.out.println("Я человек!");
}
}
Ну а потом, там где создаётся анонимный класс использовать лямбду
Person p = () -> {};
p.speak();