Функціональні інтерфейси Java

Функціональний інтерфейс в Java - це інтерфейс, який містить лише один абстрактний метод. Функціональні інтерфейси можуть мати декілька стандартних або статичних методів, але лише один абстрактний метод.

Починаючи з Java 8 і далі лямбда-вирази та посилання на методи можна використовувати для представлення екземпляра функціонального інтерфейсу.

Приклад: використання функціонального інтерфейсу з лямбда-виразом

Java
   public     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 для демонстрації функціонального інтерфейсу

Java
   class   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 містила чотири основні типи функціональних інтерфейсів, які можна застосовувати в багатьох ситуаціях, як зазначено нижче:

  1. Споживач
  2. Присудок
  3. функція 
  4. Постачальник

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 . Тип повернення всіх цих подальших спеціалізацій є лише відповідними примітивами. 

Синтаксис:

Постачальник постачальник = () -> «Привіт, світ!»;

приклад: Використання інтерфейсу предикатів для фільтрації рядків

Java
   import     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)

БіФункція

Він приймає два аргументи та повертає результат.

R застосувати (T t U u)

Унарний оператор

Це особливий випадок функції, де типи введення та виведення однакові.

T застосувати (T t)

Двійковий оператор

Це окремий випадок BiFunction, де типи введення та виведення однакові.

T застосувати (T t1 T t2)

Схожі статті

  • Java 8
  • Лямбда-вирази Java