logo

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

java значення рядка
  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)

БіФункція

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

читати з файлу csv у java

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

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

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

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

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

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

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

Схожі статті

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