logo

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

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

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

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

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

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