Функциональные интерфейсы.JAVA Flashcards
Что такое функциональный интерфейс?
Функциональный интерфейс - это интерфейс, который определяет только один абстрактный метод.
Основное назначение – использование в лямбда выражениях и method reference.
Интерфейс может включать сколько угодно default методов и при этом оставаться функциональным,потому что default методы - не абстрактные.
Для чего нужна аннотация @FunctionalInterface?
Чтобы точно определить интерфейс как функциональный, добавлена аннотация @FunctionalInterface,работающая по принципу @Override. Она обозначит замысел и не даст определить второй абстрактный метод в интерфейсе.
Какие встроенные функциональные интерфейсы вы знаете?
Встроенные функциональные интерфейсы:
Predicate<T>
Проверяет соблюдение некоторого условия. Если оно соблюдается, то возвращается значение true. В качестве параметра лямбда-выражение принимает объект типа TConsumer<T>
выполняет некоторое действие над объектом типа T, при этом ничего не возвращаяFunction<T,R>
представляет функцию перехода от объекта типа T к объекту типа RSupplier<T>
не принимает никаких аргументов, но должен возвращать объект типа TUnaryOperator<T>
принимает в качестве параметра объект типа T, выполняет над ними операции и возвращает результат операций в виде объекта типа TBinaryOperator<T>
принимает в качестве параметра два объекта типа T, выполняет над ними бинарную операцию и возвращает ее результат также в виде объекта типа T
Что такое ссылка на метод?
Ссылка на метод - это сокращенный синтаксис выражения лямбда, который выполняет только один метод. Это позволяет нам ссылаться на конструкторы или методы, не выполняя их.
Ссылки на методы бывают четырех видов:
Ссылка на статический метод - ContainingClass::staticMethodName
Ссылка на нестатический метод конкретного объекта - containingObject::instanceMethodName
Ссылка на нестатический метод любого объекта конкретного типа
ContainingType::methodName
Ссылка на конструктор ClassName::new
Что такое лямбда-выражение? Чем его можно заменить?
Упрощённая запись анонимного класса, реализующего функциональный интерфейс
Основу лямбда-выражения составляет лямбда-оператор, который представляет стрелку ->. Этот оператор разделяет лямбда-выражение на две части: левая часть содержит список параметров выражения, а правая собственно представляет тело лямбда-выражения, где выполняются все действия.
Лямбда-выражение не выполняется само по себе, а образует реализацию метода, определенного в функциональном интерфейсе. При этом важно, что функциональный интерфейс должен содержать только один единственный метод без реализации.
Представляет набор инструкций, которые можно выделить в отдельную переменную и затем многократно вызвать в различных местах программы. Образует реализацию метода, определенного в функциональном интерфейсе. При этом важно, что функциональный интерфейс должен содержать только один единственный метод без реализации.
список параметров выражения -> тело лямбда-выражения (действия)
Параметры лямбда-выражения должны соответствовать по типу параметрам метода из функционального интерфейса.
В лямбда-выражении использование обобщений не допускается. В этом случае нам надо типизировать объект интерфейса определенным типом, который потом будет применяться в лямбда-выражении.
К каким переменным есть доступ у лямбда-выражений?
Доступ к переменным внешней области действия из лямбда-выражения очень схож к доступу из анонимных объектов. Можно ссылаться на:
неизменяемые (effectively final - не обязательно помеченные как final) локальные переменные;
поля класса;
статические переменные.
К методам по умолчанию реализуемого функционального интерфейса обращаться внутри лямбда-выражения запрещено.