Java funkcionālās saskarnes

Funkcionāls Java interfeiss ir interfeiss, kas satur tikai vienu abstraktu metodi. Funkcionālajām saskarnēm var būt vairākas noklusējuma vai statiskas metodes, bet tikai viena abstraktā metode.

Sākot ar Java 8, lambda izteiksmes un metožu atsauces var izmantot, lai attēlotu funkcionāla interfeisa gadījumu.

Piemērs: Funkcionālā interfeisa izmantošana ar Lambda izteiksmi

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

Izvade
New thread created  

Paskaidrojums:

  • Iepriekš minētā programma parāda lambda izteiksmes izmantošanu ar Runnable funkcionālo saskarni.
  • Runnable ir viena abstrakta metode run(), tāpēc tā tiek kvalificēta kā funkcionāls interfeiss.
  • Lambda ()-> System.out.println ('Izveidots jauns pavediens') definē run() metodi.
  • new Thread().start() sāk jaunu pavedienu, kas izpilda lambda pamattekstu

Piezīme:

A f unctional interfeiss var arī paplašināt citu funkcionālu interfeisu.

@FunctionalInterface Anotācija

@FunctionalInterface anotācija tiek izmantota, lai nodrošinātu, ka funkcionālajā saskarnē nevar būt vairāk par vienu abstraktu metodi. Ja ir vairākas abstraktas metodes, kompilators atzīmē ziņojumu “Negaidīta @FunctionalInterface anotācija”. Tomēr šīs anotācijas izmantošana nav obligāta.

Piezīme:

@FunctionalInterface anotācija nav obligāta, taču tā ir laba prakse. Tas palīdz novērst kļūdu agrīnā stadijā, pārliecinoties, ka saskarnei ir tikai viena abstrakta metode.

Piemērs: funkcionālās saskarnes definēšana ar @FunctionalInterface anotāciju

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

Izvade
25  

Paskaidrojums :

  • Kvadrāts ir funkcionāls interfeiss ar vienu aprēķinu metodi (int x).
  • Aprēķinu metodes ieviešanai tiek izmantota lambda izteiksme (int x) -> x * x.
  • Lambda izmanto x kā ievadi un atgriež x * x.

Java funkcionālās saskarnes pirms Java 8

Pirms Java 8 mums bija jāizveido anonīmi iekšējās klases objekti vai jāievieš šīs saskarnes. Tālāk ir parādīts piemērs tam, kā palaist saskarne tika ieviesta pirms lambda izteiksmju ieviešanas.

Piemērs: Java programma funkcionālā interfeisa demonstrēšanai

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

Izvade
New thread created  

Iebūvētas Java funkcionālās saskarnes

Kopš Java SE 1.8 ir daudz saskarņu, kas tiek pārveidotas par funkcionālām saskarnēm. Visas šīs saskarnes ir anotētas ar @FunctionalInterface. Šīs saskarnes ir šādas:

  • Darbināms: Šis interfeiss satur tikai palaist () metodi.
  • Salīdzināms: Šajā saskarnē ir ietverta tikai metode salīdzinātTo().
  • ActionListener: Šajā saskarnē ir ietverta tikai metode actionPerformed().
  • Zvanāms: Šajā interfeisā ir tikai call() metode.

Funkcionālo saskarņu veidi Java

Java SE 8 ietvēra četrus galvenos funkcionālo saskarņu veidus, kurus var izmantot vairākās situācijās, kā minēts tālāk:

  1. Patērētājs
  2. Predikāts
  3. Funkcija 
  4. Piegādātājs

1. Patērētājs 

The patērētāja saskarne funkcionālā saskarne ir tā, kas pieņem tikai vienu argumentu vai ģentrificētu argumentu. Patērētāja saskarnei nav atdeves vērtības. Tas neko neatdod. Ir arī Patērētāja funkcionālie varianti DoubleConsumer IntConsumer un LongConsumer . Šie varianti pieņem primitīvas vērtības kā argumentus. 

Izņemot šos variantus, ir arī vēl viens patērētāja saskarnes variants, kas pazīstams kā Divpatērētājs

Sintakse:

Patērētājs patērētājs = (vērtība) -> System.out.println(vērtība);

Šī Java Consumer funkcionālās saskarnes ieviešana izdrukā vērtību, kas nodota kā parametrs drukas priekšrakstam. Šajā implementācijā tiek izmantota Java Lambda funkcija.

2. Predikāts 

The Predikātu saskarne apzīmē viena argumenta Būla vērtību. To parasti izmanto filtrēšanas darbībām straumēs. Tāpat kā patērētāju funkcionālajam interfeisam Predicate funkcionālajam interfeisam ir arī daži paplašinājumi. Šīs ir IntPredicate DoublePredicate un LongPredicate . Šāda veida predikātu funkcionālās saskarnes kā argumentus pieņem tikai primitīvus datu tipus vai vērtības.  

Sintakse: 

publiska saskarne Predikāts {
   Būla tests(T t);
}

Java predikātu funkcionālo interfeisu var ieviest arī, izmantojot Lambda izteiksmes.

Predikāts predikāts = (vērtība) -> vērtība != null;

3. Funkcija

A funkciju ir Java funkcionālas saskarnes veids, kas saņem tikai vienu argumentu un atgriež vērtību pēc nepieciešamās apstrādes. Daudzas dažādas funkciju saskarņu versijas ir instrumentālas, un tās parasti izmanto primitīvos veidos, piemēram, double int long.

Sintakse:

Funkcija funkcija = (vērtība) -> vērtība * vērtība;

  • Divfunkcija: The Divfunkcija ir būtiski saistīts ar funkciju. Turklāt tam ir nepieciešami divi argumenti, savukārt funkcija pieņem vienu argumentu. 
  • Unārais operators un binārais operators: Ir arī divas citas funkcionālās saskarnes, kas tiek nosauktas kā Unārs operators un Binārais operators. Tie abi paplašina funkciju un divfunkciju attiecīgi, ja gan ievades veids, gan izvades veids ir vienāds.

4. Piegādātājs

The Piegādātājs funkcionālais interfeiss ir arī funkcionālas saskarnes veids, kas neizmanto nekādu ievadi vai argumentu un tomēr atgriež vienu izvadi. Piegādātāja funkcionālās saskarnes dažādie paplašinājumi nodrošina daudzas citas piegādātāja funkcijas, piemēram BooleanSupplier DoubleSupplier LongSupplier un IntSupplier . Visu šo turpmāko specializāciju atgriešanās veids ir tikai tiem atbilstošie primitīvie. 

Sintakse:

Piegādātājs piegādātājs = () -> 'Sveika pasaule!';

Piemērs: Predikātu interfeisa izmantošana virkņu filtrēšanai

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

Izvade
Geek GeeksQuiz Geek2  

Funkcionālo saskarņu tabula

Funkcionālās saskarnes

Apraksts

Metode

Palaist

Tas apzīmē uzdevumu, ko var izpildīt, izmantojot pavedienu.

tukša palaišana ()

Salīdzināms

Tas salīdzina divus objektus pasūtīšanai.

int salīdzinātTo(T o)

ActionListener

Tas apstrādā darbības notikumu notikumu virzītā programmēšanā.

anulēta darbībaVeikts(ActionEvent e)

Sazvanāms

Tas apzīmē uzdevumu, kas var atgriezt rezultātu vai radīt izņēmumu.

V call() met Izņēmums

Patērētājs

Tas pieņem vienu ievades argumentu un neatgriež rezultātu.

anulēt pieņemt (T t)

Predikāts

Tas pieņem vienu argumentu un atgriež Būla rezultātu.

Būla tests (T t)

Funkcija

Tas pieņem vienu argumentu un atgriež rezultātu.

R pieteikties (T t)

Piegādātājs

Tas neprasa nekādus argumentus, bet sniedz rezultātu.

Saņemt ()

BiPatērētājs

Tas pieņem divus argumentus un neatgriež rezultātu.

anulēts pieņemt (T t U u)

BiPredicate

Tas pieņem divus argumentus un atgriež Būla rezultātu.

Būla tests (T t U u)

BiFunction

Tas pieņem divus argumentus un atgriež rezultātu.

Pieteikties (T t U u)

UnaryOperator

Šis ir īpašs funkcijas gadījums, kad ievades un izvades veidi ir vienādi.

T pieteikties (T t)

Binārais operators

Šis ir īpašs BiFunction gadījums, kad ievades un izvades veidi ir vienādi.

T piemērot (T t1 T t2)

Saistītie raksti

  • Java 8
  • Java Lambda izteiksmes