logo

Java funkcionalna sučelja

Funkcionalno sučelje u Javi je sučelje koje sadrži samo jednu apstraktnu metodu. Funkcionalna sučelja mogu imati više zadanih ili statičkih metoda, ali samo jednu apstraktnu metodu.

postaviti u Javi

Od Jave 8 pa nadalje lambda izrazi i reference metoda mogu se koristiti za predstavljanje instance funkcionalnog sučelja.



Primjer: Korištenje funkcionalnog sučelja s 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();  } } 

Izlaz
New thread created 

Obrazloženje:

  • Gornji program demonstrira korištenje lambda izraza s funkcionalnim sučeljem Runnable.
  • Runnable ima jednu apstraktnu metodu run() pa se kvalificira kao funkcionalno sučelje.
  • Lambda ()-> System.out.println('Stvorena je nova nit') definira metodu run().
  • new Thread().start() pokreće novu nit koja izvršava lambda tijelo

Bilješka:

A f nefunkcionalno sučelje također može proširiti drugo funkcionalno sučelje.



@Funkcionalno sučelje Anotacija

Napomena @FunctionalInterface koristi se kako bi se osiguralo da funkcionalno sučelje ne može imati više od jedne apstraktne metode. U slučaju da je prisutno više od jedne apstraktne metode, prevodilac označava poruku 'Neočekivana napomena @FunctionalInterface'. Međutim, korištenje ove napomene nije obavezno.

Bilješka:

Bilješka @FunctionalInterface nije obavezna, ali je dobra praksa za korištenje. Pomaže u otkrivanju pogreške u ranoj fazi osiguravajući da sučelje ima samo jednu apstraktnu metodu.



Primjer: Definiranje funkcionalnog sučelja s napomenom @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);  } } 

Izlaz
25 

Obrazloženje :

  • Square je funkcionalno sučelje s jednom metodom izračuna (int x).
  • Lambda izraz (int x) -> x * x koristi se za implementaciju metode izračuna.
  • Lambda uzima x kao ulaz i vraća x * x.

Java funkcionalna sučelja prije Jave 8

Prije Jave 8 morali smo stvarati anonimne unutarnje objekte klase ili implementirati ova sučelja. Ispod je primjer kako je Runnable sučelje implementirano prije uvođenja lambda izraza.

Primjer: Java program za demonstraciju funkcionalnog sučelja

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

Izlaz
New thread created 

Ugrađena Java funkcionalna sučelja

Od Java SE 1.8 nadalje postoji mnogo sučelja koja se pretvaraju u funkcionalna sučelja. Sva ova sučelja označena su s @FunctionalInterface. Ova sučelja su sljedeća:

  • Pokretljivo: Ovo sučelje sadrži samo trčanje() metoda.
  • Usporedivo: Ovo sučelje sadrži samo metodu compareTo().
  • ActionListener: Ovo sučelje sadrži samo metodu actionPerformed().
  • Poziv: Ovo sučelje sadrži samo metodu call().

Vrste funkcionalnih sučelja u Javi

Java SE 8 uključuje četiri glavne vrste funkcionalnih sučelja koja se mogu primijeniti u više situacija kao što je navedeno u nastavku:

  1. Potrošač
  2. Predikat
  3. Funkcija 
  4. Dobavljač

1. Potrošač 

The potrošačko sučelje funkcionalnog sučelja je onaj koji prihvaća samo jedan argument ili gentrificirani argument. Potrošačko sučelje nema povratnu vrijednost. Ništa ne vraća. Postoje i funkcionalne varijante Potrošača Dvostruki potrošač IntConsumer i LongConsumer . Ove varijante prihvaćaju primitivne vrijednosti kao argumente. 

Osim ovih varijanti postoji još jedna varijanta potrošačkog sučelja poznata kao Dvostruki potrošač

Sintaksa:

Potrošač potrošač = (vrijednost) -> System.out.println(vrijednost);

Ova implementacija funkcionalnog sučelja Java Consumer ispisuje vrijednost proslijeđenu kao parametar naredbi za ispis. Ova implementacija koristi Lambda funkciju Jave.

2. Predikat 

The Predikatno sučelje predstavlja funkciju s booleovom vrijednošću jednog argumenta. Obično se koristi za operacije filtriranja u tokovima. Baš kao i potrošačko funkcionalno sučelje, predikatno funkcionalno sučelje također ima neka proširenja. Ovo su IntPredicate Dvostruki predikat i Dugi predikat . Ove vrste predikatnih funkcionalnih sučelja prihvaćaju samo primitivne tipove podataka ili vrijednosti kao argumente.  

Sintaksa: 

javno sučelje Predikat{
   Booleov test(T t);
}

Funkcionalno sučelje Java predikata također se može implementirati pomoću Lambda izraza.

Predikat predikat = (vrijednost) -> vrijednost != null;

java arraylist metode

3. Funkcija

A funkcija je vrsta funkcionalnog sučelja u Javi koja prima samo jedan argument i vraća vrijednost nakon potrebne obrade. Mnoge različite verzije funkcijskih sučelja su instrumentalne i obično se koriste u primitivnim tipovima kao što je double int long.

Sintaksa:

Funkcija funkcija = (vrijednost) -> vrijednost * vrijednost;

  • Bi-funkcija: The Dvostruka funkcija bitno je povezan s funkcijom. Osim toga, uzima dva argumenta, dok funkcija prihvaća jedan argument. 
  • Unarni operator i binarni operator: Postoje i druga dva funkcionalna sučelja koja su nazvana kao Unarni operator i Binarni operator. Oboje proširuju Funkciju i Bi-Funkciju gdje su i vrsta ulaza i vrsta izlaza iste.

4. Dobavljač

The Dobavljač funkcionalno sučelje također je vrsta funkcionalnog sučelja koje ne prima nikakav ulaz ili argument, a vraća samo jedan izlaz. Različita proširenja funkcionalnog sučelja dobavljača sadrže mnoge druge funkcije dobavljača kao što su BooleanSupplier DoubleSupplier LongSupplier i IntSupplier . Povratni tip svih ovih daljnjih specijalizacija samo su njihove odgovarajuće primitive. 

Sintaksa:

Dobavljačdobavljač = () -> 'Hello World!';

Primjer: Korištenje predikatnog sučelja za filtriranje nizova

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

Izlaz
Geek GeeksQuiz Geek2 

Tablica funkcionalnih sučelja

Funkcionalna sučelja

Opis

linux preimenovati direktorij

metoda

Pokretljiv

Predstavlja zadatak koji može izvršiti nit.

void run()

Usporedivo

Uspoređuje dva objekta za naručivanje.

int compareTo(T o)

ActionListener

Obrađuje akcijski događaj u programiranju vođenom događajima.

void actionPerformed(ActionEvent e)

Poziv

Predstavlja zadatak koji može vratiti rezultat ili izbaciti iznimku.

V call() izbacuje iznimku

Potrošač

Prihvaća jedan ulazni argument i ne vraća nikakav rezultat.

nevažeći prihvatiti (T t)

css podebljano

Predikat

Prihvaća jedan argument i vraća Booleov rezultat.

Booleov test (T t)

Funkcija

Prihvaća jedan argument i vraća rezultat.

R primijeniti (T t)

Dobavljač

Ne uzima nikakve argumente, već daje rezultat.

T get()

BiPotrošač

Prihvaća dva argumenta i ne vraća nikakav rezultat.

nevažeći prihvatiti (T t U u)

red u Javi

Bipredikat

Prihvaća dva argumenta i vraća Booleov rezultat.

Booleov test (T t U u)

Bifunkcija

Prihvaća dva argumenta i vraća rezultat.

R primijeniti (T t U u)

Unarni operator

Ovo je poseban slučaj funkcije gdje su tipovi ulaza i izlaza isti.

T primijeniti (T t)

BinarniOperator

Ovo je poseban slučaj BiFunctiona gdje su tipovi ulaza i izlaza isti.

T primijeniti (T t1 T t2)

Povezani članci

  • Java 8
  • Java Lambda izrazi