Јава функционални интерфејси

Функционални интерфејс у ​​Јави је интерфејс који садржи само једну апстрактну методу. Функционални интерфејси могу имати више подразумеваних или статичких метода, али само једну апстрактну методу.

Од Јаве 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  

Објашњење:

  • Горњи програм показује употребу ламбда израза са Руннабле функционалним интерфејсом.
  • Руннабле има један апстрактни метод рун() тако да се квалификује као функционални интерфејс.
  • Ламбда ()-> Систем.оут.принтлн('Нова нит креирана') дефинише методу рун().
  • нев Тхреад().старт() покреће нову нит која извршава ламбда тело

Напомена:

А ф ункциони интерфејс такође може да прошири још један функционални интерфејс.

@ФунцтионалИнтерфаце Анотација

Анотација @ФунцтионалИнтерфаце се користи да би се осигурало да функционални интерфејс не може имати више од једне апстрактне методе. У случају да је присутно више од једне апстрактне методе, компајлер означава поруку „Неочекивана напомена @ФунцтионалИнтерфаце“. Међутим, није обавезно користити ову напомену.

Напомена:

Белешка @ФунцтионалИнтерфаце није обавезна, али је добра пракса за коришћење. Помаже да се грешка ухвати у раној фази тако што се увери да интерфејс има само један апстрактни метод.

Пример: Дефинисање функционалног интерфејса са напоменом @ФунцтионалИнтерфаце

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  

Објашњење :

  • Квадрат је функционални интерфејс са једном методом израчуна (инт к).
  • За имплементацију методе израчунавања користи се ламбда израз (инт к) -> к * к.
  • Ламбда узима к као улаз и враћа к * к.

Јава функционални интерфејси пре Јаве 8

Пре Јаве 8 морали смо да креирамо анонимне објекте унутрашње класе или имплементирамо ове интерфејсе. Испод је пример како је Руннабле интерфејс имплементиран пре увођења ламбда израза.

Пример: Јава програм за демонстрацију функционалног интерфејса

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  

Уграђени Јава функционални интерфејси

Од Јава СЕ 1.8 па надаље постоји много интерфејса који се претварају у функционалне интерфејсе. Сви ови интерфејси су означени са @ФунцтионалИнтерфаце. Ови интерфејси су следећи:

  • Може се покренути: Овај интерфејс садржи само рун() методом.
  • Упоредиво: Овај интерфејс садржи само метод цомпареТо().
  • АцтионЛистенер: Овај интерфејс садржи само метод ацтионПерформед().
  • Позив: Овај интерфејс садржи само метод цалл().

Типови функционалних интерфејса у Јави

Јава СЕ 8 укључује четири главне врсте функционалних интерфејса који се могу применити у више ситуација као што је наведено у наставку:

  1. Цонсумер
  2. Предикат
  3. Функција 
  4. Добављач

1. Потрошач 

Тхе интерфејс потрошача функционалног интерфејса је онај који прихвата само један аргумент или гентрификовани аргумент. Потрошачки интерфејс нема повратну вредност. Не враћа ништа. Постоје и функционалне варијанте Потрошача ДоублеЦонсумер ИнтЦонсумер и ЛонгЦонсумер . Ове варијанте прихватају примитивне вредности као аргументе. 

Осим ових варијанти, постоји још једна варијанта корисничког интерфејса позната као Би-Цонсумер

Синтакса:

Цонсумер потрошач = (вредност) -> Систем.оут.принтлн(вредност);

Ова имплементација функционалног интерфејса Јава Цонсумер штампа вредност која је прослеђена као параметар наредби за штампање. Ова имплементација користи Ламбда функцију Јаве.

2. Предикат 

Тхе Интерфејс предиката представља функцију са логичком вредношћу једног аргумента. Обично се користи за операције филтрирања у токовима. Баш као и функционални интерфејс потрошача, функционални интерфејс предиката такође има нека проширења. Ово су ИнтПредицате ДоублеПредицате и ЛонгПредицате . Ови типови предикатних функционалних интерфејса прихватају само примитивне типове података или вредности као аргументе.  

Синтакса: 

јавни интерфејс Предикат {
   боолеан тест(Т т);
}

Функционални интерфејс Јава предиката се такође може имплементирати помоћу Ламбда израза.

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

3. Функција

А функција је тип функционалног интерфејса у Јави који прима само један аргумент и враћа вредност након потребне обраде. Многе различите верзије интерфејса функција су инструменталне и обично се користе у примитивним типовима као што је доубле инт лонг.

Синтакса:

Функција функција = (вредност) -> вредност * вредност;

  • Би-функција: Тхе Би-Фунцтион је суштински повезан са функцијом. Осим тога, узима два аргумента, док функција прихвата један аргумент. 
  • Унарни оператор и бинарни оператор: Постоје и два друга функционална интерфејса која су названа као Унари Оператор и Бинарни оператор. Обе проширују функцију и би-функцију где су и тип улаза и тип излаза исти.

4. Добављач

Тхе Добављач функционални интерфејс је такође тип функционалног интерфејса који не узима никакав улаз или аргумент, а ипак враћа један излаз. Различита проширења функционалног интерфејса добављача садрже многе друге функције добављача као што су БоолеанСупплиер ДоублеСупплиер ЛонгСупплиер и ИнтСупплиер . Тип повратка свих ових даљих специјализација су само њихови одговарајући примитиви. 

Синтакса:

Добављач добављач = () -> 'Здраво свет!';

Пример: Коришћење интерфејса предиката за филтрирање низова

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  

Табела функционалних интерфејса

Функционални интерфејси

Опис

Метод

Руннабле

Представља задатак који се може извршити помоћу нити.

воид рун()

Упоредиво

Упоређује два објекта за наручивање.

инт цомпареТо(Т о)

АцтионЛистенер

Обрађује догађај акције у програмирању вођеном догађајима.

воид ацтионПерформед(АцтионЕвент е)

Позивно

Представља задатак који може вратити резултат или избацити изузетак.

В цалл() избацује изузетак

Цонсумер

Прихвата један улазни аргумент и не враћа резултат.

неважећи прихватити (Т т)

Предикат

Прихвата један аргумент и враћа логички резултат.

боолеан тест (Т т)

Функција

Прихвата један аргумент и враћа резултат.

Р примени (Т т)

Добављач

Не узима никакве аргументе, али даје резултат.

Т гет()

БиЦонсумер

Прихвата два аргумента и не враћа резултат.

неважећи прихвати (Т т У у)

БиПредицате

Прихвата два аргумента и враћа логички резултат.

логички тест (Т т У у)

БиФунцтион

Прихвата два аргумента и враћа резултат.

Р примени (Т т У у)

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

Ово је посебан случај функције где су типови улаза и излаза исти.

Т примени (Т т)

БинарниОператор

Ово је посебан случај БиФункције где су типови улаза и излаза исти.

Т примени(Т т1 Т т2)

Повезани чланци

  • Јава 8
  • Јава Ламбда изрази

Топ Чланци

Категорија