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(), така че се квалифицира като функционален интерфейс.
  • Lambda ()-> System.out.println('Създадена е нова нишка') дефинира метода run().
  • new Thread().start() стартира нова нишка, която изпълнява ламбда тялото

Забележка:

А f нефункционалният интерфейс може също да разшири друг функционален интерфейс.



@Функционален интерфейс Анотация

Анотацията @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 е функционален интерфейс с един метод изчисление (int x).
  • Използва се ламбда израз (int x) -> x * x за прилагане на метода за изчисляване.
  • Lambda приема 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 потребителски интерфейс на функционалния интерфейс е този, който приема само един аргумент или gentrified аргумент. Потребителският интерфейс няма върната стойност. Не връща нищо. Има и функционални варианти на потребителя DoubleConsumer IntConsumer и LongConsumer . Тези варианти приемат примитивни стойности като аргументи. 

Освен тези варианти има още един вариант на потребителския интерфейс, известен като Двуконсуматор

Синтаксис:

Потребител потребител = (стойност) -> System.out.println(стойност);

Тази реализация на функционалния интерфейс на Java Consumer отпечатва стойността, предадена като параметър на израза за печат. Тази реализация използва функцията Lambda на Java.

2. Сказуемо 

The Предикатен интерфейс представлява функция с булева стойност на един аргумент. Обикновено се използва за филтриране на операции в потоци. Точно като потребителския функционален интерфейс, предикатният функционален интерфейс също има някои разширения. Това са IntPredicate DoublePredicate и LongPredicate . Тези типове предикатни функционални интерфейси приемат само примитивни типове данни или стойности като аргументи.  

Синтаксис: 

публичен интерфейс Предикат{
   булев тест (T t);
}

Функционалният интерфейс на предиката на Java може също да бъде реализиран с помощта на ламбда изрази.

Предикат предикат = (стойност) -> стойност != нула;

размер на текст латекс

3. Функция

А функция е тип функционален интерфейс в Java, който получава само един аргумент и връща стойност след необходимата обработка. Много различни версии на функционалните интерфейси са инструментални и обикновено се използват в примитивни типове като double int long.

Синтаксис:

функция функция = (стойност) -> стойност * стойност;

  • Би-функция: The Би-функция е съществено свързано с функция. Освен това приема два аргумента, докато функцията приема един аргумент. 
  • Унарен оператор и двоичен оператор: Има и два други функционални интерфейса, които са наречени като Унарен оператор и Двоичен оператор. И двете разширяват функцията и съответно Bi-Function, където и типът вход, и типът изход са еднакви.

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()

BiConsumer

Приема два аргумента и не връща резултат.

невалидно приемане (T t U u)

BiPredicate

Приема два аргумента и връща булев резултат.

булев тест (T t U u)

BiFunction

Приема два аргумента и връща резултат.

блокирани номера

R прилага (T t U u)

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

Това е специален случай на функция, при който типовете вход и изход са еднакви.

T прилага (T t)

Двоичен оператор

Това е специален случай на BiFunction, където типовете вход и изход са еднакви.

T прилага (T t1 T t2)

Свързани статии

  • Java 8
  • Ламбда изрази на Java