J
Java Geek
@java_geek2.5K подп.
800просмотров
32.4%от подписчиков
22 декабря 2025 г.
questionScore: 880
☕️ Лямбды и Функциональные интерфейсы: Как это работает под капотом? Мы все любим лямбды в Java за краткость. Но задумывались ли вы, как строго типизированная Java понимает запись x -> x * 2, не зная типа переменной x? Все дело в Функциональных интерфейсах. Давайте разберем механику, которая превращает "бойлерплейт" в элегантный код. 🧩 Что такое SAM? В основе лежит концепция SAM (Single Abstract Method). Функциональный интерфейс - это интерфейс, у которого есть ровно один абстрактный метод. Лямбда-выражение - это не самостоятельный объект. Это ленивая реализация этого самого единственного метода "на лету". 🔥 До vs После Взгляните, как функциональный интерфейс Predicate<T> убивает лишний шум: // ❌ До Java 8 (Анонимный класс) // Куча лишнего кода ради одной проверки Predicate<String> isLong = new Predicate<String>() { @Override public boolean test(String s) { return s.length() > 5; } }; // ✅ С Лямбдой // Компилятор видит Predicate -> ищет метод test -> подставляет логику Predicate<String> isLong = s -> s.length() > 5; ⚙️ Магия invokedynamic Многие думают, что лямбда - это просто "сахар" для анонимных классов. Это не так! 💜 Анонимный класс создает реальный .class файл на диске при компиляции. 💜 Лямбда использует инструкцию байт-кода invokedynamic. Она связывает метод динамически только когда это нужно. 👉 Итог: Меньше мусора в памяти и быстрее загрузка приложения. 📚 Шпаргалка: "Великолепная четверка" В java.util.function есть интерфейсы на все случаи жизни. Запомните базу: 1. Predicate<T> ➜ boolean 💜 Суть: Проверка условия (фильтры). 💜 Пример: stream().filter(x -> x > 0) 2. Consumer<T> ➜ void 💜 Суть: Потребитель. Что-то делает с объектом, ничего не возвращая. 💜 Пример: list.forEach(System.out::println) 3. Function<T, R> ➜ R 💜 Суть: Преобразователь. Берет T, возвращает R. 💜 Пример: stream().map(User::getName) 4. Supplier<T> ➜ T 💜 Суть: Поставщик. Ничего не принимает, отдает объект. 💜 Пример: Optional.orElseGet(() -> new User()) 💡Всегда ставьте аннотацию @FunctionalInterface над своими интерфейсами. Это защитит от случайного добавления второго абстрактного метода, который сломает все лямбды в проекте. 👉 @java_geek
800
просмотров
2188
символов
Да
эмодзи
Нет
медиа

Другие посты @java_geek

Все посты канала →
☕️ Лямбды и Функциональные интерфейсы: Как это работает под — @java_geek | PostSniper