Функціональний інтерфейс в Java - це інтерфейс, який містить лише один абстрактний метод. Функціональні інтерфейси можуть мати декілька стандартних або статичних методів, але лише один абстрактний метод.
Починаючи з Java 8 і далі лямбда-вирази та посилання на методи можна використовувати для представлення екземпляра функціонального інтерфейсу.
Приклад: використання функціонального інтерфейсу з лямбда-виразом
Javapublic class Geeks { public static void main(String[] args) { // Using lambda expression to implement Runnable new Thread(() -> System.out.println('New thread created')).start(); } }
Вихід
New thread created
Пояснення:
- Програма вище демонструє використання лямбда-виразу з функціональним інтерфейсом Runnable.
- Runnable має один абстрактний метод run(), тому він кваліфікується як функціональний інтерфейс.
- Лямбда ()-> System.out.println('Створено новий потік') визначає метод run().
- new Thread().start() запускає новий потік, який виконує тіло лямбда
Примітка:
А f нефункціональний інтерфейс також може розширювати інший функціональний інтерфейс.
@FunctionalInterface Анотація
Анотація @FunctionalInterface використовується для забезпечення того, що функціональний інтерфейс не може мати більше одного абстрактного методу. Якщо присутні більше одного абстрактного методу, компілятор позначає повідомлення «Неочікувана анотація @FunctionalInterface». Однак використання цієї анотації не є обов’язковим.
Примітка:
Анотація @FunctionalInterface є необов’язковою, але це хороша практика для використання. Це допомагає виявити помилку на ранній стадії, переконавшись, що інтерфейс має лише один абстрактний метод.
Приклад: визначення функціонального інтерфейсу за допомогою анотації @FunctionalInterface
Java@FunctionalInterface interface Square { int calculate(int x); } class Geeks { public static void main(String args[]) { int a = 5; // lambda expression to define the calculate method Square s = (int x) -> x * x; // parameter passed and return type must be same as defined in the prototype int ans = s.calculate(a); System.out.println(ans); } }
Вихід
25
Пояснення :
- Square — це функціональний інтерфейс із єдиним методомcalculate(int x).
- Для реалізації методу обчислення використовується лямбда-вираз (int x) -> x * x.
- Лямбда приймає x як вхідні дані та повертає x * x.
Функціональні інтерфейси Java до Java 8
До Java 8 нам доводилося створювати анонімні об’єкти внутрішнього класу або реалізовувати ці інтерфейси. Нижче наведено приклад того, як інтерфейс Runnable був реалізований до появи лямбда-виразів.
приклад: Програма Java для демонстрації функціонального інтерфейсу
Javaclass Geeks { public static void main(String args[]) { // create anonymous inner class object new Thread(new Runnable() { @Override public void run() { System.out.println('New thread created'); } }).start(); } }
Вихід
New thread created
Вбудовані функціональні інтерфейси Java
Починаючи з Java SE 1.8 і далі існує багато інтерфейсів, які перетворюються на функціональні інтерфейси. Усі ці інтерфейси анотовані @FunctionalInterface. Ці інтерфейси такі:
- Запуск: Цей інтерфейс містить лише запустити() метод.
- Порівняний: Цей інтерфейс містить лише метод compareTo().
- ActionListener: Цей інтерфейс містить лише метод actionPerformed().
- Виклик: Цей інтерфейс містить лише метод call().
Типи функціональних інтерфейсів в Java
Java SE 8 містила чотири основні типи функціональних інтерфейсів, які можна застосовувати в багатьох ситуаціях, як зазначено нижче:
java значення рядка
- Споживач
- Присудок
- функція
- Постачальник
1. Споживацька
The споживчий інтерфейс функціонального інтерфейсу – це той, який приймає лише один аргумент або об’єднаний аргумент. Інтерфейс споживача не повертає значення. Нічого не повертає. Існують також функціональні варіанти Консуматора DoubleConsumer IntConsumer і LongConsumer . Ці варіанти приймають примітивні значення як аргументи.
Окрім цих варіантів, існує ще один варіант інтерфейсу споживача, відомий як Біспоживач .
Синтаксис:
Споживач
споживач = (значення) -> System.out.println(значення);
Ця реалізація функціонального інтерфейсу Java Consumer друкує значення, передане як параметр оператора друку. Ця реалізація використовує функцію Lambda Java.
2. Присудок
The Інтерфейс предикатів являє собою функцію з булевим значенням одного аргументу. Він зазвичай використовується для фільтрації операцій у потоках. Так само, як і функціональний інтерфейс споживача, функціональний інтерфейс предикату також має деякі розширення. Це IntPredicate DoublePredicate і LongPredicate . Ці типи функціональних інтерфейсів предикатів приймають лише примітивні типи даних або значення як аргументи.
Синтаксис:
публічний інтерфейс Предикат
{
булевий тест (T t);
}
Функціональний інтерфейс предикату Java також можна реалізувати за допомогою лямбда-виразів.
Присудок
предикат = (значення) -> значення != null;
3. Функція
А функція це тип функціонального інтерфейсу в Java, який отримує лише один аргумент і повертає значення після необхідної обробки. Багато різних версій функціональних інтерфейсів є інструментальними і зазвичай використовуються в примітивних типах, таких як double int long.
Синтаксис:
функція
функція = (значення) -> значення * значення;
- Бі-функція: The Бі-функція суттєво пов’язана з функцією. Крім того, вона приймає два аргументи, тоді як функція приймає один аргумент.
- Унарний оператор і двійковий оператор: Є також два інших функціональних інтерфейси, які називаються як Унарний оператор і Двійковий оператор. Обидва вони розширюють Функцію та Бі-функцію відповідно, де тип введення та тип виведення однакові.
4. Постачальник
The Постачальник Функціональний інтерфейс також є типом функціонального інтерфейсу, який не приймає жодного введення чи аргументу, але повертає єдиний вихід. Різні розширення функціонального інтерфейсу постачальника містять багато інших функцій постачальника, наприклад BooleanSupplier DoubleSupplier LongSupplier і IntSupplier . Тип повернення всіх цих подальших спеціалізацій є лише відповідними примітивами.
Синтаксис:
Постачальник
постачальник = () -> «Привіт, світ!»;
приклад: Використання інтерфейсу предикатів для фільтрації рядків
Javaimport java.util.*; import java.util.function.Predicate; class Geeks { public static void main(String args[]) { // create a list of strings List<String> n = Arrays.asList('Geek' 'GeeksQuiz' 'g1' 'QA' 'Geek2'); // declare the predicate type as string and use lambda expression to create object Predicate<String> p = (s) -> s.startsWith('G'); // Iterate through the list for (String st : n) { // call the test method if (p.test(st)) System.out.println(st); } } }
Вихід
Geek GeeksQuiz Geek2
Таблиця функціональних інтерфейсів
Функціональні інтерфейси | опис | метод |
---|---|---|
Працездатний | Він являє собою завдання, яке може бути виконане потоком. | void run() |
Порівнянний | Він порівнює два об’єкти для впорядкування. | int compareTo(T o) |
ActionListener | Він обробляє подію дії в програмуванні, керованому подіями. | void actionPerformed(ActionEvent e) |
Викличний | Він представляє завдання, яке може повертати результат або створювати виняток. | V call() створює виняток |
Споживач | Він приймає один вхідний аргумент і не повертає жодного результату. | недійсний прийняти (T t) |
Присудок | Він приймає один аргумент і повертає логічний результат. | булевий тест (T t) |
функція | Він приймає один аргумент і повертає результат. | R застосувати (T t) |
Постачальник | Він не вимагає жодних аргументів, але дає результат. | T get() |
БіСпоживач | Він приймає два аргументи і не повертає жодного результату. | void accept(T t U u) |
БіПредикат | Він приймає два аргументи та повертає логічний результат. | булевий тест (T t U u) |
БіФункція | Він приймає два аргументи та повертає результат. читати з файлу csv у java | R застосувати (T t U u) |
Унарний оператор | Це особливий випадок функції, де типи введення та виведення однакові. | T застосувати (T t) |
Двійковий оператор | Це окремий випадок BiFunction, де типи введення та виведення однакові. | T застосувати (T t1 T t2) |
Схожі статті
- Java 8
- Лямбда-вирази Java