Функциональные интерфейсы
Что такое функциональные интерфейсы?
Функциональный интерфейс задаёт единственный функциональный контракт абстрактного метода. Аннотация @FunctionalInterface необязательна и ставится на интерфейсе, а не на методе. Default- и static-методы не мешают; методы, совпадающие с public-методами Object, не учитываются при определении функционального контракта.
Основные характеристики функциональных интерфейсов:-
Один абстрактный метод: Функциональный интерфейс может содержать только один абстрактный метод, но может также содержать любое количество методов по умолчанию (default methods) или статических методов.
-
Аннотация
@FunctionalInterface: Для обозначения функционального интерфейса используется аннотация@FunctionalInterface. Это помогает компилятору проверить, что интерфейс соответствует требованиям функционального интерфейса (имеет только один абстрактный метод).
Примеры стандартных функциональных интерфейсов, включенных в стандартную библиотеку Java (package java.util.function):
-
Supplier<T>: поставщик (не принимает аргументов, возвращает значение типа T). -
Consumer<T>: потребитель (принимает аргумент типа T, не возвращает значения). -
Predicate<T>: предикат (принимает аргумент типа T, возвращает boolean). -
Function<T, R>: функция (принимает аргумент типа T, возвращает значение типа R).
@FunctionalInterface
interface MyFunction {
void myMethod(String arg);
}
public class Main {
public static void main(String[] args) {
// Использование лямбда-выражения для реализации функционального интерфейса
MyFunction func = (arg) -> System.out.println("Hello, " + arg);
func.myMethod("world");
}
}
Для чего нужен функциональный интерфейс BiConsumer<T,U>?
Функциональный интерфейс BiConsumer<T, U> в Java представляет собой интерфейс, который определяет операцию, принимающую два входных аргумента (типов T и U) и не возвращающую результат (void). Он используется для передачи операций, которые принимают два аргумента и выполняют какие-то действия с ними, например, их выводят на экран, сохраняют в базу данных или выполняют любую другую операцию.
BiConsumer<T, U>
:
-
Параметризация типами T и U: Эти типы могут быть любыми объектными типами данных, например,
Integer,String,Objectи т.д. -
Нет возвращаемого значения: Метод
accept(T t, U u)интерфейсаBiConsumerничего не возвращает (void). -
Пример использования:
import java.util.function.BiConsumer; public class Main { public static void main(String[] args) { BiConsumer<String, Integer> printLength = (str, num) -> System.out.println("Length of '" + str + "' is " + num); printLength.accept("Java", 4); printLength.accept("OpenAI", 6); } }Здесь
printLength— это экземпляр функционального интерфейсаBiConsumer, который принимает строку и целое число (длину строки) и выводит информацию о длине строки на экран. -
Использование в потоковых операциях:
BiConsumerможет использоваться в потоковых операциях для выполнения параллельных действий над парами данных.
BiConsumer<T, U> полезен в случаях, когда требуется
выполнить операции, которые работают с двумя аргументами, не возвращая
результат. Это удобно для реализации методов обратного вызова, для обработки
данных в парах или для выполнения действий над двумя различными аргументами
одновременно.
Для чего нужен функциональный интерфейс BiFunction<T,U,R>?
Функциональный интерфейс BiFunction<T, U, R> в Java представляет собой интерфейс, который определяет функцию, принимающую два входных аргумента (типов T и U) и возвращающую результат (типа R). Он используется для передачи операций, которые принимают два аргумента и возвращают какое-то значение на основе этих аргументов.
BiFunction<T, U, R>
:
-
Параметризация типами T, U и R: Эти типы могут быть любыми объектными типами данных, например,
Integer,String,Objectи т.д.Rобозначает тип возвращаемого значения. -
Метод
apply: ИнтерфейсBiFunctionсодержит абстрактный методR apply(T t, U u), который принимает два аргумента типовTиUи возвращает значение типаR. -
Пример использования:
import java.util.function.BiFunction; public class Main { public static void main(String[] args) { BiFunction<String, Integer, String> repeat = (str, count) -> { StringBuilder result = new StringBuilder(); for (int i = 0; i < count; i++) { result.append(str); } return result.toString(); }; String repeated = repeat.apply("Hello", 3); System.out.println(repeated); // Выведет: HelloHelloHello } }Здесь
repeat— это экземпляр функционального интерфейсаBiFunction, который принимает строку (String) и целое число (Integer) и возвращает строку (String), повторяющуюся заданное количество раз. -
Использование в потоковых операциях:
BiFunctionможет использоваться в потоковых операциях для преобразования или комбинирования данных, которые требуют двух входных аргументов.
BiFunction<T, U, R> полезен в случаях, когда нужно
выполнить операции, зависящие от двух аргументов, и вернуть какой-то результат.
Он обеспечивает гибкость и возможность создавать функции, способные работать с
двумя различными типами данных и возвращать результат, соответствующий задаче.
Для чего нужен функциональный интерфейс BiPredicate<T,U>?
Функциональный интерфейс BiPredicate<T, U> в Java представляет собой интерфейс, который определяет предикат — операцию, принимающую два входных аргумента (типов T и U) и возвращающую булево значение (boolean). Он используется для передачи операций, которые проверяют условие на основе двух аргументов и возвращают true или false.
BiPredicate<T, U>
:
-
Параметризация типами T и U: Эти типы могут быть любыми объектными типами данных, например,
Integer,String,Objectи т.д. -
Метод
test: ИнтерфейсBiPredicateсодержит абстрактный методboolean test(T t, U u), который принимает два аргумента типовTиUи возвращает булево значение (trueилиfalse). -
Пример использования:
import java.util.function.BiPredicate; public class Main { public static void main(String[] args) { BiPredicate<String, Integer> isLengthGreaterThan = (str, length) -> str.length() > length; boolean result1 = isLengthGreaterThan.test("Java", 3); System.out.println("Is 'Java' longer than 3? " + result1); // Выведет: true boolean result2 = isLengthGreaterThan.test("Python", 6); System.out.println("Is 'Python' longer than 6? " + result2); // Выведет: false } }Здесь
isLengthGreaterThan— это экземпляр функционального интерфейсаBiPredicate, который проверяет длину строки (String) и возвращаетtrue, если длина больше указанного числа. -
Использование в потоковых операциях:
BiPredicateможет использоваться в потоковых операциях для фильтрации данных, зависящей от двух входных аргументов.
BiPredicate<T, U> полезен в ситуациях, когда требуется
проверять условия, зависящие от двух различных типов данных, и возвращать
результат в виде булевого значения. Он обеспечивает гибкость и возможность
создавать функции для сложных логических проверок, которые требуют двух
аргументов.
Для чего нужны функциональные интерфейсы вида _To_Function?
Функциональные интерфейсы вида _To_Function в Java представляют собой группу интерфейсов, которые принимают один тип данных и возвращают другой тип данных. Они используются для передачи операций, которые преобразуют входные данные одного типа в выходные данные другого типа.
_To_Function
:
-
Преобразование данных: Интерфейсы, такие как
Function<T, R>,ToIntFunction<T>,ToDoubleFunction<T>,ToLongFunction<T>,LongToDoubleFunction, и другие, используются для преобразования данных из одного типа в другой. -
Потоковые операции: В Java 8 и более поздних версиях многие из этих интерфейсов широко используются в потоковых операциях (
Stream API) для выполнения преобразований данных или извлечения нужных значений из объектов. -
Функции обратного вызова (Callback functions): Они часто используются как функции обратного вызова, когда требуется выполнить определенные операции над данными и вернуть результат.
Вот некоторые примеры функциональных интерфейсов вида _To_Function и их основные задачи:
-
Function<T, R>: Принимает аргумент типаTи возвращает результат типаR. -
ToIntFunction<T>,ToDoubleFunction<T>,ToLongFunction<T>: Принимают аргумент типаTи возвращают примитивные значенияint,double,longсоответственно. -
LongToDoubleFunction,IntToDoubleFunction: Принимают примитивные значенияlongилиintи возвращают значениеdouble. -
DoubleToIntFunction,DoubleToLongFunction: Принимают значениеdoubleи возвращают примитивные значенияintилиlong.