logo

Funkcionalni vmesniki Java

Funkcionalni vmesnik v Javi je vmesnik, ki vsebuje samo eno abstraktno metodo. Funkcionalni vmesniki imajo lahko več privzetih ali statičnih metod, vendar samo eno abstraktno metodo.

Od Jave 8 naprej je mogoče za predstavitev primerka funkcionalnega vmesnika uporabiti lambda izraze in reference metod.

Primer: uporaba funkcionalnega vmesnika z lambda izrazom

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

Izhod
New thread created 

Pojasnilo:



  • Zgornji program prikazuje uporabo lambda izraza s funkcionalnim vmesnikom Runnable.
  • Runnable ima eno abstraktno metodo run(), zato se kvalificira kot funkcionalni vmesnik.
  • Lambda ()-> System.out.println('Ustvarjena nova nit') definira metodo run().
  • new Thread().start() zažene novo nit, ki izvaja telo lambda

Opomba:

A f nefunkcionalni vmesnik lahko razširi tudi drug funkcionalni vmesnik.

@Funkcijski vmesnik Opomba

Opomba @FunctionalInterface se uporablja za zagotovitev, da funkcijski vmesnik ne more imeti več kot ene abstraktne metode. Če je prisotnih več kot ena abstraktna metoda, prevajalnik označi sporočilo 'Nepričakovana opomba @FunctionalInterface'. Vendar uporaba te opombe ni obvezna.

Opomba:

Opomba @FunctionalInterface ni obvezna, vendar jo je dobro uporabiti. Pomaga odkriti napako v zgodnji fazi, tako da poskrbi, da ima vmesnik samo eno abstraktno metodo.

Primer: Definiranje funkcionalnega vmesnika z opombo @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);  } } 

Izhod
25 

Pojasnilo :

  • Square je funkcionalni vmesnik z eno samo metodo izračuna (int x).
  • Lambda izraz (int x) -> x * x se uporablja za izvedbo metode izračuna.
  • Lambda sprejme x kot vhod in vrne x * x.

Funkcionalni vmesniki Jave pred Javo 8

Pred Javo 8 smo morali ustvariti anonimne objekte notranjega razreda ali implementirati te vmesnike. Spodaj je primer, kako je bil vmesnik Runnable implementiran pred uvedbo lambda izrazov.

primer: Program Java za predstavitev funkcionalnega vmesnika

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

Izhod
New thread created 

Vgrajeni funkcionalni vmesniki Java

Od Java SE 1.8 naprej obstaja veliko vmesnikov, ki so pretvorjeni v funkcionalne vmesnike. Vsi ti vmesniki so označeni z @FunctionalInterface. Ti vmesniki so naslednji:

  • Izvedljivo: Ta vmesnik vsebuje samo teči() metoda.
  • Primerljivo: Ta vmesnik vsebuje samo metodo compareTo().
  • ActionListener: Ta vmesnik vsebuje samo metodo actionPerformed().
  • Klicati: Ta vmesnik vsebuje samo metodo call().

Vrste funkcionalnih vmesnikov v Javi

Java SE 8 je vključevala štiri glavne vrste funkcionalnih vmesnikov, ki jih je mogoče uporabiti v več situacijah, kot je navedeno spodaj:

povratni tip v Javi
  1. Potrošnik
  2. Predikat
  3. funkcija 
  4. Dobavitelj

1. Potrošnik 

The potrošniški vmesnik funkcionalnega vmesnika je tisti, ki sprejme le en argument ali gentrificiran argument. Uporabniški vmesnik nima povratne vrednosti. Nič ne vrne. Obstajajo tudi funkcionalne različice Potrošnika DoubleConsumer IntConsumer in LongConsumer . Te različice sprejemajo primitivne vrednosti kot argumente. 

Poleg teh različic obstaja še ena različica potrošniškega vmesnika, znana kot Dvopotrošnik

Sintaksa:

Potrošnik potrošnik = (vrednost) -> System.out.println(vrednost);

Ta izvedba funkcijskega vmesnika Java Consumer natisne vrednost, posredovano kot parameter v stavku za tiskanje. Ta izvedba uporablja funkcijo Lambda v Javi.

2. Predikat 

The Predikatni vmesnik predstavlja funkcijo enega argumenta z logično vrednostjo. Običajno se uporablja za operacije filtriranja v tokovih. Tako kot potrošniški funkcionalni vmesnik ima tudi predikatni funkcionalni vmesnik nekaj razširitev. To so IntPredicate DoublePredicate in Dolgi predikat . Te vrste predikatnih funkcionalnih vmesnikov kot argumente sprejemajo samo primitivne vrste podatkov ali vrednosti.  

Sintaksa: 

javni vmesnik Predikat{
   logični test (T t);
}

Funkcionalni vmesnik predikata Java je mogoče implementirati tudi z uporabo izrazov Lambda.

Predikat predikat = (vrednost) -> vrednost != nič;

gostitelj linux

3. Funkcija

A funkcijo je vrsta funkcionalnega vmesnika v Javi, ki prejme le en argument in po zahtevani obdelavi vrne vrednost. Veliko različnih različic funkcijskih vmesnikov je instrumentalnih in se običajno uporabljajo v primitivnih tipih, kot je dvojno int long.

Sintaksa:

funkcija funkcija = (vrednost) -> vrednost * vrednost;

  • Bi-funkcija: The Bi-funkcija je bistveno povezano s funkcijo. Poleg tega potrebuje dva argumenta, medtem ko funkcija sprejme en argument. 
  • Unarni in binarni operator: Obstajata tudi dva druga funkcionalna vmesnika, ki sta poimenovana kot Unarni operater in Binarni operator. Oba razširjata funkcijo in bi-funkcijo, kjer sta vhodna in izhodna vrsta enaki.

4. Dobavitelj

The Dobavitelj funkcionalni vmesnik je tudi vrsta funkcionalnega vmesnika, ki ne sprejema nobenega vnosa ali argumenta, vendar vrne en sam izhod. Različne razširitve funkcionalnega vmesnika dobavitelja vsebujejo številne druge funkcije dobavitelja, npr BooleanSupplier DoubleSupplier LongSupplier in IntSupplier . Povratni tip vseh teh nadaljnjih specializacij je le njihovih ustreznih primitivov. 

Sintaksa:

Dobaviteljdobavitelj = () -> 'Pozdravljen svet!';

primer: Uporaba predikatnega vmesnika za filtriranje nizov

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);  }  } } 

Izhod
Geek GeeksQuiz Geek2 

Tabela funkcionalnih vmesnikov

Funkcionalni vmesniki

Opis

Metoda

Izvedljivo

Predstavlja nalogo, ki jo lahko izvede nit.

void run()

Primerljivo

Primerja dva predmeta za naročanje.

int compareTo(T o)

ActionListener

Obravnava akcijski dogodek v programiranju, ki ga vodi dogodek.

void actionPerformed(ActionEvent e)

Kličljivo

cdr polna oblika

Predstavlja nalogo, ki lahko vrne rezultat ali povzroči izjemo.

V call() vrže izjemo

Potrošnik

Sprejme en sam vhodni argument in ne vrne nobenega rezultata.

sprejeti nič (T t)

Predikat

Sprejme en sam argument in vrne logični rezultat.

logični test (T t)

funkcija

Sprejme en argument in vrne rezultat.

imessage igre na androidu

R uporabi (T t)

Dobavitelj

Ne zahteva nobenih argumentov, ampak zagotavlja rezultat.

T get()

BiConsumer

Sprejme dva argumenta in ne vrne nobenega rezultata.

void accept(T t U u)

Bipredikat

Sprejme dva argumenta in vrne logični rezultat.

logični test (T t U u)

BiFunction

Sprejme dva argumenta in vrne rezultat.

centos vs redhat

R uporabi (T t U u)

UnaryOperator

To je poseben primer funkcije, kjer sta vhodni in izhodni tip enaka.

T uporabi (T t)

BinaryOperator

To je poseben primer BiFunction, kjer sta vhodni in izhodni tip enaka.

T uporabi (T t1 T t2)

Sorodni članki

  • Java 8
  • Lambda izrazi Java