Помогает избавиться от ненужных абстракций с непредсказуемым поведением и сделать программу более предсказуемой и уменьшить количество возможных ошибок.
Часто ФЯ используют для создания искусственного интеллекта и высоконагруженных вычислительных систем.
- Также ФЯ применяются в DataScience и BigData. Эта область требует выполнения огромного количества вычислений за короткий промежуток времени, без нагрузки на аппаратную часть оборудования. Вот здесь чаще всего и используют функциональные языки, а императивные для создания интерфейса.
В ООП внимание уделяется объектам, их взаимодействию и идентичности.
В процедурном всегда идёт описание действий, которые необходимо выполнить машине чтобы достичь требуемого результата. Преимущества функционального программирования
Простое тестирование и отладка. Это возможно благодаря чистым функциям, которые используют неизменяемые значения, принимают аргументы и осуществляют выводы.
Ленивая оценка. Значение оценивается и сохраняется только в случае необходимости.
Применение и реализация параллелизма. Это возможно благодаря чистым функциям, которые не вносят никаких изменений в данные и переменные.
Способность обрабатывать функции как значения. Значения передаются функциям в качестве параметров — от такой реализации код становится читаемым, простым и понятным.
Простота понимания чистых функций. Чистые функции зависят только от входных данных, они не меняют значения и состояния программы. Каким бы ни был результат, они возвращают изначальное значение.
Ориентирование на результаты, а не процесс. Важный момент в программировании — получение удобоваримого конечного результата.
Неизменяемые данные. Это значит, что можно легко создавать структуры данных и при этом не изменять уже существующие.
Недостатки функционального программирования
Объединение чистых функций с другими операциями ввода-вывода.
Неизменяемость и рекурсия иногда могут приводить к снижению производительности.
Рекурсия, в отличие от метода написание программ при помощи циклов, не слишком распространена, оттого может пугать и отталкивать.
Многие объекты создаются в момент кодирования, потому его сложно поддерживать.
Функциональное программирование позволяет избавиться от проблем и ошибок в коде, эффективно использует лямбда-исчисление, поддерживает вложенные функции. Оно предлагает большие возможности модульности при меньшем количестве строк кода, тем самым увеличивая продуктивность разработчика.
2. Что такое функциональный интерфейс
Интерфейс называется функциональным, если в нем имеется ровно один абстрактный метод.
- ФИ это интерфейс с одним единственным абстрактным методом;
- Функциональные интерфейсы посредством их реализации через лямбда выражения позволяют писать код в функциональном стиле. Для чего нужен ФИ и зачем был добавлен
Благодаря Ф.И. стало возможно избавиться от монструозного синтаксиса с анонимными классами и использовать компактные лямбда выражения и ссылки на методы, это открыло возможность писать на Java программы в функциональном стиле, характерном для функциональных языков программирования, это когда программа записывается как последовательное применение функций к некоторым значениям и другим функциям, а не как сложная структура из циклов, условных операторов и перекладывания значений переменных туда-сюда.
Перечислить основные семейства ФИ? Что они принимают и что возвращают?
Основные семейства из стандартной библиотеки:
• Consumer’ы – потребители, принимают какие-то данные, обрабатывают их в методе accept, но ничего не возвращают.
• Supplier’ы – поставщики – ничего не принимают в качестве параметра, а просто возвращают какое-то значение
• Predicate’ы – принимают значение какого-то типа, возвращает boolean значение (true/false).
• Function – функции – принимают аргумент и возвращают значение какого-то типа.
• Операторы – (UnaryOperator, BiOperator) – частный случай функций – принимают и возвращают значения одного и того же типа.
Декларативный и императивный методы описания
Императивная программа содержит прямые указания, что должен сделать компьютер и в каком порядке должны выполняться инструкции. Примерами императивных языков являются Java, Python, JavaScript, C, C++.Декларативная же программа состоит из ограничений и правил, из которых компьютер генерирует способ получения результата. Пример декларативного языка: SQL.
3.Обязательна ли аннотация @FunctionalInterface?НЕТ!
Ее предназначение - сообщить компилятору, что данный интерфейс функциональный и должен содержать не более одного метода. Если же в интерфейсе с данной аннотацией более одного нереализованного (абстрактного) метода, компилятор не пропустит данный интерфейс, так как будет воспринимать его как ошибочный код. Интерфейсы и без данной аннотации могут считаться функциональными и будут работать, а @FunctionalInterface является не более чем дополнительной страховкой. 4.Что такое default методы в интерфейсе и для чего они были введены
В ситуациях когда различные использующие интерфейс классы имели одинаковый код, чтобы не было повторений добавили дефолт методы, которые имеют реализацию. Они позволяют обобщать поведение, дефолтный метод можно переопределить при необходимости.
(для обратной совместимости)
В Java 8 вместе с лямбдами и стримами появилась острая необходимость дополнить стандартные интерфейсы новыми методами. Чтобы не ломать обратную совместимость, были добавлены методы по умолчанию.
Теперь добавление ключевого слова default к методу интерфейса позволяет добавить ему тело. Все новые методы старых интерфейсов снабжаются дефолтной реализацией.
В реализации такого метода его дефолтный вариант вызывается тем же синтаксисом, что и внешний класс из вложенного: InterfaceName.super.methodName(). 5.Может ли ФИ содержать что-то кроме абстрактного метода
Может содержать дефолтные методы, приватные и статические методы, статические поля – константы.
Эти методы реализуют какую-то дополнительную логику (например объединение предикатов конъюнкция (p1.and(p2)) или получение обратного предиката p1.nigate();)
Они необходимы для обратной совместимости, чтобы добавить функционал интерфейса, при этом не меняя сам класс. Применяя методы с реализацией есть возможность не ломать старый код, который написан ранее.
Сколько дефолтных методов и статических методов, статических полей в интерфейсе? Не ограничено Где находятся ФИ?в пакете java.util.function 6.Все способы реализации функционального интерфейса?
Все способы реализации ФИ (4 штуки: ссылка на метод, лямбда, через анонимный класс, через обычную имплементацию в классе.)
Какие есть способы инстанцировать ФИ
* через экземпляр класса, реализующий функциональный интерфейс.
* через лямбда-выражение (если логика метода состоит из нескольких инструкций и требуется оператор return – то они заключаются в фигурные скобки, а если вся логика это только одно выражение, то скобки можно опустить.)
* через ссылку на обычный нестатический метод (через конкретный объект (ссылку на негго) и имя метода, или через имя класса и имя метода но передав сам объект в качестве параметра.)
* через ссылку на статический метод (через имя класса и имя метод)
* через конструктор (через имя класса и оператор new)
* через анонимный класс (объявить его через переменную типа функционального интерфейса) Как можно инстанцировать через ссылку на нестатический метод
Через ссылку на экземпляр класса и имя метода, или через имя класса и имя метода, но передав при этом в качестве параметра на первом месте сам объект