Анонимный класс (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 шт):

Автор решения: Andrey Tabakov

Анонимный класс не декларируется в коде как непосредственный 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, но это темы для отдельных вопросов.

→ Ссылка
Автор решения: user722558

Для начала надо объявить интерфейс для создания анонимного класса

interface Person {
    public void speak() {
        System.out.println("Я человек!");
    }
}

Ну а потом, там где создаётся анонимный класс использовать лямбду

Person p = () -> {};
p.speak();
→ Ссылка