Блок Примитивные типы
Скачать 6.67 Mb.
|
Что такое функциональные интерфейсы? Для чего нужны? Функциональный интерфейс в Java – это интерфейс, который содержит только 1 абстрактный метод. Основное назначение – использование в лямбда-выражениях и ссылках на методы. Какой аннотацией помечается функциональный интерфейс? Предназначение @FunctionalInterface — сообщить компилятору, что данный интерфейс функциональный и должен содержать не более одного метода. Если же в интерфейсе с данной аннотацией более одного не реализованного (абстрактного) метода, компилятор не пропустит данный интерфейс, так как будет воспринимать его как ошибочный код. Интерфейсы и без данной аннотации могут считаться функциональными и будут работать, а @FunctionalInterface является не более чем дополнительной страховкой. Может ли функциональный интерфейс содержать что-то кроме абстрактного метода? Что такое default методы? Функциональный интерфейс может содержать любое количество методов по умолчанию (default) или статических методов. default – реализованные методы в функциональных интерфейсах. При наследовании интерфейса можно переопределить эти методы или же оставить всё как есть (оставить логику по умолчанию). Статические методы в интерфейсе помогают обеспечивать безопасность, не позволяя классам, которые реализуют интерфейс, переопределить их. Где находятся функциональные интерфейсы? Многие функциональные интерфейсы, предоставляемые Java8, находятся в пакете java.util.function. Сколько дефолтных методов и статических методов, статических полей в функциональном интерфейсе? Ограничений по количеству методов и полей в функциональном интерфейсе нет (кроме абстрактного метода). Основные типы функциональных интерфейсов. Predicate — функциональный интерфейс для проверки соблюдения некоторого условия. Если условие соблюдается, возвращает true, иначе — false. Содержит метод boolean test(T t). Consumer (с англ. — “потребитель”) — принимает в качестве входного аргумента объект типа T, совершает некоторые действия, но при этом ничего не возвращает. Содержит метод void accept(T t). Supplier (с англ. — поставщик) — не принимает никаких аргументов, но возвращает некоторый объект типа T. Содержит метод T get(). Function—принимает аргумент T и приводит его к объекту типа R, который и возвращается как результат. Содержит метод R apply(T t); Может возвращать и объект того же типа, какой принимает. UnaryOperator — принимает в качестве параметра объект типа T, выполняет над ним некоторые операции и возвращает результат операций в виде объекта того же типа T. Содержит метод T apply(T t). BinaryOperator — принимает в качестве параметра два объекта типа T, выполняет над ними бинарную операцию и возвращает ее результат также в виде объекта типа T. Содержит метод T apply(T t1, T t2). Расскажите про Comparator и Comparable? Интерфейс Comparable используется только для сравнения объектов класса, в котором данный интерфейс реализован. Т.е. interface Comparable определяет логику сравнения объекта определенного ссылочного типа внутри своей реализации (по правилам разработчика). Comparator представляет отдельную реализацию и ее можно использовать многократно и с различными классами. Т.е. interface Comparator позволяет создавать объекты, которые будут управлять процессом сравнения (например, при сортировках). Какие есть способы инстанцировать функциональные интерфейсы? - создать экземпляр анонимного или именованного класса, реализующего интерфейс Function; - воспользоваться ссылкой на метод; - написать лямбда-выражение; Отличие BinaryOperator от Function Function(функция) используется для преобразования входного параметра или в двух параметров (для BiFunction) в какое-либо значение, тип значение может не совпадать с типом входных параметров. BinaryOperator это разновидность Function, в которых входные и выходные обобщенные параметры должны совпадать. Если заглянуть в пакет java.util.function, то можно заметить, что UnaryOperator расширяет Function, а BinaryOperator расширяет BiFunction. Все способы реализации функционального интерфейса? В Java 8 функциональные интерфейсы могут быть представлены с использованием лямбда-выражений, ссылок на методы и ссылок на конструкторы. Императивный vs декларативный подход. Декларативное программирование - парадигма программирования, в которой задаётся спецификация решения задачи, то есть описывается ожидаемый результат, а не способ его получения. Императивное программирование — это парадигма программирования, в которой задаётся последовательность действий, необходимых для получения результата. Декларативный стиль Такой стиль, в котором вы описываете, какой именно результат вам нужен. И получатель такого сообщения уже сам разбирается, какие шаги для этого надо предпринять. Функциональное программирование- плюсы минусы, где применяется. Функциональное программирование помогает сделать код более понятным, предсказуемым и легким для чтения. Использование принципов функционального программирования помогает избавиться от ненужных абстракций с непредсказуемым поведением, поэтому сделать программу более предсказуемой и уменьшить количество возможных ошибок. ООП-подход подразумевает написание базовых классов и расширение существующих путем добавления к ним методов. Данные хранятся в экземпляре класса вместе с методами, которые ими оперируют. Функции в ООП зависят от внешних данных (например, содержат внутри себя ссылки на глобальные переменные) или коммуницируют с внешним миром (ввод-вывод). В отличие от ООП, функциональное программирование характеризуется слабой связью функции с данными, которыми она оперирует. Это позволяет избежать побочных эффектов при выполнении функций — например чтения и изменения глобальных переменных, операций ввода-вывода и так далее. Детерминированные функции ФП возвращают один и тот же результат для одних и тех же аргументов. Самое большое преимущество функционального программирования-краткость, потому что код может быть более кратким. Функциональная программа не создает переменную итератора в качестве центра цикла, поэтому этот и другие виды накладных расходов исключаются из вашего кода. Другим важным преимуществом является параллелизм, что легче сделать с функциональным программированием, поскольку компилятор заботится о большинстве операций, которые раньше требовали ручной настройки переменных состояния (например, итератора в цикле). |