Стандартные (предопределенные) функциональные интерфейсы Java
Содержание
- 1. Общие сведения о стандартных интерфейсах Java. Список интерфейсов
- 2. Функциональный интерфейс UnaryOperator<T>. Пример
- 3. Функциональный интерфейс BinaryOperator<T>. Пример
- 4. Функциональный интерфейс Consumer<T>. Пример
- 5. Функциональный интерфейс Supplier<T>. Пример
- 6. Функциональный интерфейс Function<T, R>. Пример
- 7. Функциональный интерфейс Predicate<T>. Пример
- Связанные темы
Поиск на других ресурсах:
1. Общие сведения о стандартных интерфейсах Java. Список интерфейсов
Начиная с версии JDK 8, в языке Java определен ряд стандартных (предопределенных) функциональных интерфейсов. Эти интерфейсы широко используются в стандартных библиотеках языка Java, в частности, в средствах обработки потоков данных StreamAPI. Стандартные функциональные интерфейсы также можно использовать при разработке собственных программ.
Чтобы использовать стандартный интерфейс Java нужно подключить пакет java.util.function как показано ниже
import java.util.function.*;
Ниже приведен перечень стандартных функциональных интерфейсов.
- UnaryOperator<T> – выполняет унарную операцию над объектом обобщенного типа T и возвращает результат типа T. Определяет метод apply();
- BinaryOperator<T> — выполняет логическую операцию над двумя объектами типа T и возвращает результат того же типа. Определяет метод apply();
- Consumer<T> — определяет метод accept(), который выполняет операцию над объектом типа T;
- Supplier<T> — определяет метод get(), который возвращает объект типа T;
- Function<T, R> — определяет метод apply(), который выполняет операцию над объектом типа T и возвращает результат типа R;
- Predicate<T> — определяет метод test(). Метод получает параметром объект типа T и возвращает логическое значение. Метод test() определяет, удовлетворяет объект типа T некоторому логическому условию.
⇑
2. Функциональный интерфейс UnaryOperator<T>. Пример
В примере, с помощью функционального интерфейса UnaryOperator<T> определяется лямбда-выражение которое возвращает результат умножения входного параметра на 2.
// Предопределенные стандартные функциональные интерфейсы Java // Подключить пакет java.util.function import java.util.function.*; public class FunctionalInterfaces { public static void main(String[] args) { // Функциональный интерфейс UnaryOperator<T> // Задача. Реализовать лямбда-выражение, удваивающее указанное число. // 1. Объявить ссылку на UnaryOperator<T> и присвоить ей лямбда-выражение UnaryOperator<Double> number = (n) -> n*2; // 2. Вызвать метод number.apply() Double t = number.apply(2.8); System.out.println("t = " + t); // t = 5.6 } }
⇑
3. Функциональный интерфейс BinaryOperator<T>. Пример
Функциональный интерфейс BinaryOperator<T> определяет метод apply(), который получает два параметра типа T и возвращает результат типа T. Метод выполняет некоторую операцию над параметрами. Сама операция реализуется в лямбда-выражении.
В примере демонстрируется интерфейс BinaryOperator<T>, который возводит первый параметр в степень, определенной вторым параметром.
// Предопределенные функциональные интерфейсы Java // Подключить пакет java.util.function import java.util.function.*; public class FunctionalInterfaces { public static void main(String[] args) { // Функциональный интерфейс BinaryOperator<T> // Задача. Реализовать лямбда-выражение, возводящее число m в степень n. // 1. Объявить ссылку на BinaryOperator<T> BinaryOperator<Double> ref; // 2. Присвоить ссылке лямбда-выражение ref = (m, n) -> { return Math.pow(m, n); // вызвать функцию pow() }; // 3. Вызвать метод number.apply() для параметров 3.0, 4.0 Double t = ref.apply(3.0, 4.0); System.out.println("t = " + t); // t = 81.0 } }
⇑
4. Функциональный интерфейс Consumer<T>. Пример
Функциональный интерфейс Consumer<T> предназначен для выполнения некоторого действия над объектом типа T. Интерфейс содержит метод accept(), который получает объект типа T и возвращает результат типа void().
import java.util.function.*; public class TrainConsumer { public static void main(String[] args) { // Функциональный интерфейс Consumer<T> // Задача. Реализовать действие, которое реверсирует целое число і // выводит результат на экран. // 1. Объявить ссылку на интерфейс Consumer<T> для типа Integer Consumer<Integer> cn; // 2. Реализовать лямбда-выражение cn = (n) -> { Integer t = n, number = 0; while (t>0) { number = number * 10 + t % 10; t = t/10; } System.out.println("number = " + number); }; // 3. Вызвать метод accept() cn.accept(219); } }
Результат выполнения программы
number = 912
⇑
5. Функциональный интерфейс Supplier<T>. Пример
Функциональный интерфейс Supplier<T> предназначен для получения объекта типа T. В интерфейсе определяется метод get(), который возвращает объект типа T.
// Предопределенные функциональные интерфейсы Java // Подключить пакет java.util.function import java.util.function.*; public class FunctionalInterfaces { public static void main(String[] args) { // Стандартный интерфейс Supplier<T> // 1. Получить объект типа Integer // 1.1. Объявить ссылку типа Supplier<Integer> Supplier<Integer> ref; ref = () -> { return new Integer(23); }; // 1.2. Вызвать метод get() интерфейса Integer objInt = ref.get(); System.out.println("objInt = " + objInt); // 2. Получить объект типа Double[] - массив чисел // 2.1. Ссылка + лямбда-выражение, возвращающее массив из 5 случайных чисел Supplier<Double[]> refArray = () -> { Double[] AD = new Double[5]; for (int i=0; i<AD.length; i++) AD[i] = Math.random()*100; return AD; // вернуть массив из 5 чисел }; // 2.2. Вызвать метод get() интерфейса Double[] AD2 = refArray.get(); // 2.3. Вывести массив AD2 System.out.println("Array AD2."); for (Double x : AD2) System.out.print(x + " "); System.out.println(); } }
Результат выполнения
objInt = 23 Array AD2. 61.68462285137686 42.26246057548983 83.29368996444896 97.23604356051317 55.11066428763471
⇑
6. Функциональный интерфейс Function<T, R>. Пример
Функциональный интерфейс Function<T, R> содержит метод apply(). Этот метод получает один параметр (объект) типа T и возвращает результат (объект) типа R.
Ниже приведен пример использования данного функционального интерфейса.
// Предопределенные функциональные интерфейсы Java // Подключить пакет java.util.function import java.util.function.*; public class FunctionalInterfaces { public static void main(String[] args) { // Функциональный интерфейс Function<T, R> // Задача 1. Реализовать вычисление корня из числа // 1.1. Объявить ссылку на функциональный интерфейс Function<T, R> Function<Integer, Double> ref1; // 1.2. Присвоить этой ссылке лямбда-выражение ref1 = n -> Math.sqrt(n); // 1.3. Продемонстрировать вычисление корня квадратного из 81 Double result1 = ref1.apply(81); System.out.println("result1 = " + result1); // result1 = 9.0 // ---------------------------------------------- // Задача 2. Определить, есть ли число отрицательным // 2.1. Объявить ссылку на функциональный интерфейс Function<T, R> Function<Double, Boolean> ref2; // 2.2. Присвоить этой ссылке лямбда-выражение ref2 = (n) -> { if (n<0) return true; return false; }; // 2.3. Продемонстрировать работу лямбда-выражения Boolean result2 = ref2.apply(-20.5); System.out.println("result2 = " + result2); } }
Результат выполнения программы
result1 = 9.0 result2 = true
⇑
7. Функциональный интерфейс Predicate<T>. Пример
Функциональный интерфейс Pridicate<T> определяет метод test(), который получает значение типа T и возвращает результат типа boolean. В методе test() определяется проверка некоторого условия.
// Предопределенные функциональные интерфейсы Java // Подключить пакет java.util.function import java.util.function.*; public class FunctionalInterfaces { public static void main(String[] args) { // Функциональный интерфейс Predicate<T> // 1. Ссылка на Predicate<Integer> Predicate<Integer> ref; // 2. Одиночное лямбда-выражение, определяющее есть ли value положительным ref = (value) -> value>0; System.out.println("-37 > 0 = " + ref.test(-37)); // 3. Блочное лямбда-выражение, определяющее находится ли value в диапазоне [0..99] ref = (value) -> { if ((value>=0)&&(value<=99)) return true; return false; }; boolean result = ref.test(77); System.out.println("value in the range [0..99] = " + result); } }
Результат выполнения программы
-37 > 0 = false value in the range [0..99] = true
⇑
Связанные темы
- Лямбда-выражения. Основные понятия. Функциональный интерфейс. Примеры
- Лямбда-выражения для обобщенных функциональных интерфейсов
- Передача лямбда-выражения в метод в качестве параметра. Примеры
- Генерирование исключений в лямбда-выражениях. Примеры
⇑