Java назавжди залишилася мовою об'єктно-орієнтованого програмування. За допомогою об’єктно-орієнтованої мови програмування ми можемо оголосити, що все, що є в мові програмування Java, обертається в об’єктах, за винятком деяких примітивних типів даних і примітивних методів для цілісності та простоти. У мові програмування під назвою Java немає окремих функцій. Функції в мові програмування Java є частиною класу, і якщо хтось хоче їх використовувати, він повинен використовувати клас або об’єкт класу для виклику будь-якої функції.
Функціональні інтерфейси Java
А функціональний інтерфейс це інтерфейс, який містить лише один абстрактний метод. Вони можуть демонструвати лише одну функцію. Починаючи з Java 8 і далі, лямбда-вирази може використовуватися для представлення екземпляра функціонального інтерфейсу. Функціональний інтерфейс може мати будь-яку кількість методів за замовчуванням. Працездатний , ActionListener , і Порівнянний є деякі приклади функціональних інтерфейсів.
Функціональний інтерфейс додатково розпізнається як Інтерфейси єдиного абстрактного методу . Коротше кажучи, вони також відомі як Інтерфейси SAM . Функціональні інтерфейси в Java — це нова функція, яка надає користувачам підхід до фундаментального програмування.
Функціональні інтерфейси включені в Java SE 8 з лямбда-виразами та посиланнями на методи, щоб зробити код більш читабельним, чистим і простим. Функціональні інтерфейси — це інтерфейси, які забезпечують включення лише одного абстрактного методу. Функціональні інтерфейси використовуються та виконуються шляхом представлення інтерфейсу за допомогою анотація наз @FunctionalInterface . Як описано раніше, функціональні інтерфейси можуть містити лише один абстрактний метод. Однак вони можуть містити будь-яку кількість стандартних і статичних методів.
У функціональних інтерфейсах немає потреби використовувати ключове слово abstract, оскільки використовувати ключове слово abstract необов’язково, оскільки за замовчуванням метод, визначений всередині інтерфейсу, є лише абстрактним. Ми також можемо назвати лямбда-вирази екземпляром функціонального інтерфейсу.
Приклад функціональних інтерфейсів Java
Приклад 1:
До Java 8 нам доводилося створювати анонімні об’єкти внутрішнього класу або реалізовувати ці інтерфейси.
Java
// Java program to demonstrate functional interface> class> Test {> > 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>
приклад 2:
Java 8 і вище, ми можемо призначити лямбда-вираз до свого об’єкта функціонального інтерфейсу так:
Java
// Java program to demonstrate Implementation of> // functional interface using lambda expressions> class> Test {> > public> static> void> main(String args[])> > {> > // lambda expression to create the object> > new> Thread(() ->{> > System.out.println(> 'New thread created'> );> > }).start();> > }> }> |
>
>Вихід
New thread created>
Анотація @FunctionalInterface
Анотація @FunctionalInterface використовується для забезпечення того, що функціональний інтерфейс не може мати більше одного абстрактного методу. Якщо присутні більше одного абстрактного методу, компілятор позначає повідомлення «Неочікувана анотація @FunctionalInterface». Проте використання цієї анотації не є обов’язковим.
Нижче наведено реалізацію вищезазначеної теми:
Java
// Java program to demonstrate lambda expressions to> // implement a user defined functional interface.> @FunctionalInterface> interface> Square {> > int> calculate(> int> x);> }> class> Test {> > 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);> > }> }> |
Команди sql ddl
>
>Вихід
25>
Деякі вбудовані функціональні інтерфейси Java
Починаючи з Java SE 1.8 і далі, існує багато інтерфейсів, які перетворюються на функціональні інтерфейси. Усі ці інтерфейси анотовані @FunctionalInterface. Ці інтерфейси такі:
- Runnable –> Цей інтерфейс містить лише метод run(). Comparable –> Цей інтерфейс містить лише метод compareTo(). ActionListener –> Цей інтерфейс містить лише метод actionPerformed(). Callable –> Цей інтерфейс містить лише метод call().
Java SE 8 містила чотири основних типи функціональних інтерфейсів який можна застосовувати в кількох ситуаціях, як зазначено нижче:
- Предикатна функція споживача Supplier
Серед попередніх чотирьох інтерфейсів перші три інтерфейси, тобто Споживач, Предикат і Функція, також мають доповнення, які надаються нижче –
onclick javascript
- Споживач -> Бі-споживач
- Присудок -> Бі-присудок
- Функція -> бі-функція, унарний оператор, двійковий оператор
1. Споживацька
Споживацький інтерфейс функціонального інтерфейсу – це той, який приймає лише один аргумент або облаштований аргумент. Інтерфейс споживача не повертає значення. Нічого не повертає. Існують також функціональні варіанти Споживача — DoubleConsumer, IntConsumer і LongConsumer. Ці варіанти приймають примітивні значення як аргументи.
Окрім цих варіантів, існує ще один варіант інтерфейсу Consumer, відомий як Bi-Consumer.
Біспоживач – Bi-Consumer — найцікавіший варіант інтерфейсу Consumer. Інтерфейс споживача приймає лише один аргумент, але з іншого боку, інтерфейс Bi-Consumer приймає два аргументи. І Consumer, і Bi-Consumer не мають зворотного значення. Він також нічого не повертає, як інтерфейс споживача. Він використовується для ітерації по записах карти.
Синтаксис / Прототип функціонального інтерфейсу користувача –
Consumer consumer = (value) ->System.out.println(значення);>
Ця реалізація функціонального інтерфейсу Java Consumer друкує значення, передане як параметр оператора друку. Ця реалізація використовує функцію Lambda Java.
2. Присудок
У науковій логіці функція, яка приймає аргумент і, у відповідь, генерує логічне значення як відповідь, відома як предикат. Подібним чином у мові програмування Java функціональний інтерфейс предикату Java є типом функції, яка приймає одне значення або аргумент і виконує певну обробку з ним, і повертає логічну відповідь (Істина/Неправда). Реалізація функціонального інтерфейсу Predicate також інкапсулює логіку фільтрації (процес, який використовується для фільтрації компонентів потоку на основі наданого предиката) у Java.
Подібно до функціонального інтерфейсу Consumer, функціональний інтерфейс Predicate також має деякі розширення. Це IntPredicate, DoublePredicate і LongPredicate. Ці типи функціональних інтерфейсів предикатів приймають лише примітивні типи даних або значення як аргументи.
Бі-предикат – Bi-Predicate також є розширенням функціонального інтерфейсу Predicate, який замість одного приймає два аргументи, виконує деяку обробку та повертає логічне значення.
Синтаксис предикатного функціонального інтерфейсу –
public interface Predicate { boolean test(T t); }>
Функціональний інтерфейс предиката також може бути реалізований за допомогою класу. Синтаксис для реалізації предикатного функціонального інтерфейсу за допомогою класу наведено нижче –
public class CheckForNull implements Predicate { @Override public boolean test(Object o) { return o != null; } }>
Функціональний інтерфейс предикату Java також можна реалізувати за допомогою лямбда-виразів. Нижче наведено приклад реалізації функціонального інтерфейсу Predicate –
Predicate predicate = (value) ->значення != null;>
Ця реалізація функціональних інтерфейсів у Java з використанням лямбда-виразів Java більш керована та ефективна, ніж реалізація, реалізована за допомогою класу, оскільки обидві реалізації виконують однакову роботу, тобто повертають той самий результат.
3. Функція
Функція — це тип функціонального інтерфейсу в Java, який отримує лише один аргумент і повертає значення після необхідної обробки. Існує багато версій функціональних інтерфейсів, оскільки примітивний тип не може означати загальний аргумент типу, тому нам потрібні ці версії функціональних інтерфейсів. Багато різних версій функціональних інтерфейсів є інструментальними і зазвичай використовуються в примітивних типах, таких як double, int, long. Різні послідовності цих примітивних типів також використовуються в аргументі.
Ці версії:
Бі-функція
Бі-функція суттєво пов’язана з функцією. Крім того, вона приймає два аргументи, тоді як функція приймає один аргумент.
Прототип і синтаксис Bi-Function наведено нижче –
@FunctionalInterface public interface BiFunction { R apply(T t, U u); ....... }>
У наведеному вище коді інтерфейсу T і U є входами, і є лише один вихід, який є R.
Унарний і двійковий оператори
Є також два інших функціональних інтерфейсу, які називаються Унарний оператор і Двійковий оператор. Вони обидва розширюють функцію і бі-функцію відповідно. Простими словами, унарний оператор розширює функцію, а бінарний оператор розширює бі-функцію.
Прототип унарного оператора та двійкового оператора згадано нижче:
i. Унарний оператор
@FunctionalInterface public interface UnaryOperator extends Function { ……... }>
ii . Двійковий оператор
@FunctionalInterface public interface BinaryOperator extends BiFunction { ……... }>
Ми можемо зрозуміти на прикладі вище, що унарний оператор приймає лише один аргумент і повертає лише один аргумент. Тим не менш, в унарному операторі вхідні та вихідні значення мають бути однаковими та одного типу.
З іншого боку, двійковий оператор приймає два значення та повертає одне значення, порівнянне з бі-функцією, але подібне до унарного оператора, типи вхідних і вихідних значень мають бути ідентичними й одного типу.
4. Постачальник
Функціональний інтерфейс постачальника також є типом функціонального інтерфейсу, який не приймає жодних вхідних даних чи аргументів, але повертає єдиний вихід. Цей тип функціонального інтерфейсу зазвичай використовується для відкладеної генерації значень. Функціональні інтерфейси постачальника також використовуються для визначення логіки генерації будь-якої послідовності. Наприклад – логіка ряду Фібоначчі може бути згенерована за допомогою потоку. генерувати метод, який реалізований функціональним інтерфейсом постачальника.
Різні розширення функціонального інтерфейсу Supplier містять багато інших функцій постачальників, наприклад BooleanSupplier, DoubleSupplier, LongSupplier і IntSupplier. Тип повернення всіх цих подальших спеціалізацій є лише відповідними примітивами.
Синтаксис/прототип функціонального інтерфейсу постачальника –
@FunctionalInterface public interface Supplier{ // gets a result …………. // returns the specific result ………… T.get(); }>
Нижче наведено реалізацію вищезазначеної теми:
Java
безкоштовне проти безкоштовного
// A simple program to demonstrate the use> // of predicate interface> import> java.util.*;> import> java.util.function.Predicate;> class> Test {> > public> static> void> main(String args[])> > {> > // create a list of strings> > List names = Arrays.asList(> > 'Geek'> ,> 'GeeksQuiz'> ,> 'g1'> ,> 'QA'> ,> 'Geek2'> );> > // declare the predicate type as string and use> > // lambda expression to create object> > Predicate p = (s) ->s.startsWith(> 'G'> );> > // Iterate through the list> > for> (String st : names) {> > // call the test method> > if> (p.test(st))> > System.out.println(st);> > }> > }> }> |
>
>Вихід
Geek GeeksQuiz Geek2>
Важливі моменти/спостереження ns:
Ось кілька важливих моментів щодо функціональних інтерфейсів у Java:
- У функціональних інтерфейсах підтримується лише один абстрактний метод. Якщо анотація функціонального інтерфейсу, тобто @FunctionalInterface, не реалізована або написана за допомогою функціонального інтерфейсу, у ньому можна оголосити більше ніж один абстрактний метод. Однак у цій ситуації з більш ніж однією функцією цей інтерфейс не буде називатися функціональним інтерфейсом. Це називається нефункціональним інтерфейсом.
- Немає такої потреби в анотації @FunctionalInterface, оскільки вона є лише добровільною. Це написано, тому що це допомагає перевірити рівень компілятора. Крім того, це необов'язково.
- До функціонального інтерфейсу можна додати нескінченну кількість методів (статичних або типових). Простіше кажучи, функціональний інтерфейс, що містить статичні та типові методи, не обмежений.
- Перевизначення методів із батьківського класу не порушує правил функціонального інтерфейсу в Java.
- The java.util.function пакет містить багато вбудованих функціональних інтерфейсів у Java 8.