Стандартні (наперед визначені) функціональні інтерфейси 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) { // Стандартний інтерфейс DemoSupplier<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
⇑
Зв’язані теми
- Лямбда-вирази. Основні поняття. Функціональний інтерфейс. Приклади
- Лямбда-вирази для узагальнених функціональних інтерфейсів. Приклади
- Передача лямбда-виразу в метод в якості параметру. Приклади
- Генерування виключень у лямбда-виразах. Приклади
⇑