Java funkcinės sąsajos

Funkcinė Java sąsaja yra sąsaja, kurioje yra tik vienas abstraktus metodas. Funkcinės sąsajos gali turėti kelis numatytuosius arba statinius metodus, bet tik vieną abstraktų metodą.

Pradedant nuo „Java 8“, lambda išraiškos ir metodų nuorodos gali būti naudojamos funkcinės sąsajos egzemplioriui pavaizduoti.

Pavyzdys: Funkcinės sąsajos naudojimas su Lambda išraiška

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

Išvestis
New thread created  

Paaiškinimas:

  • Aukščiau pateikta programa demonstruoja lambda išraiškos naudojimą su Runnable funkcine sąsaja.
  • Runnable turi vieną abstraktų metodą run(), todėl jis laikomas funkcine sąsaja.
  • Lambda ()-> System.out.println ('Sukurta nauja gija') apibrėžia run() metodą.
  • new Thread().start() pradeda naują giją, kuri vykdo lambda korpusą

Pastaba:

A f neveiksminga sąsaja taip pat gali išplėsti kitą funkcinę sąsają.

@Funkcinė sąsaja Anotacija

@FunctionalInterface anotacija naudojama siekiant užtikrinti, kad funkcinė sąsaja negalėtų turėti daugiau nei vieno abstrakčiojo metodo. Jei yra daugiau nei vienas abstraktus metodas, kompiliatorius pažymi pranešimą „Netikėta @FunctionalInterface anotacija“. Tačiau šios anotacijos naudoti neprivaloma.

Pastaba:

@FunctionalInterface anotacija yra neprivaloma, tačiau tai yra gera praktika. Tai padeda pastebėti klaidą ankstyvoje stadijoje, nes užtikrina, kad sąsajoje yra tik vienas abstraktus metodas.

Pavyzdys: funkcinės sąsajos apibrėžimas naudojant @FunctionalInterface anotaciją

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

Išvestis
25  

Paaiškinimas :

  • Kvadratas yra funkcinė sąsaja su vienu skaičiavimo metodu (int x).
  • Skaičiavimo metodui įgyvendinti naudojama lambda išraiška (int x) -> x * x.
  • Lambda priima x kaip įvestį ir grąžina x * x.

„Java“ funkcinės sąsajos prieš „Java 8“.

Prieš „Java 8“ turėjome sukurti anoniminius vidinės klasės objektus arba įdiegti šias sąsajas. Toliau pateikiamas pavyzdys, kaip paleidžiama sąsaja buvo įdiegta prieš įvedant lambda išraiškas.

Pavyzdys: Java programa, skirta parodyti funkcinę sąsają

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

Išvestis
New thread created  

Integruotos Java funkcinės sąsajos

Nuo Java SE 1.8 versijos yra daug sąsajų, kurios konvertuojamos į funkcines sąsajas. Visos šios sąsajos yra pažymėtos @FunctionalInterface. Šios sąsajos yra tokios:

  • Galima paleisti: Šioje sąsajoje yra tik paleisti () metodas.
  • Palyginti: Šioje sąsajoje yra tik palyginimas() metodas.
  • ActionListener: Šioje sąsajoje yra tik metodas actionPerformed().
  • Galima skambinti: Šioje sąsajoje yra tik call() metodas.

„Java“ funkcinių sąsajų tipai

„Java SE 8“ apima keturias pagrindines funkcines sąsajas, kurios gali būti taikomos keliose situacijose, kaip nurodyta toliau:

  1. Vartotojas
  2. Predikatas
  3. Funkcija 
  4. Tiekėjas

1. Vartotojas 

The vartotojo sąsaja funkcinė sąsaja yra ta, kuri priima tik vieną argumentą arba gentrifikuotą argumentą. Vartotojo sąsaja neturi grąžinimo vertės. Tai nieko negrąžina. Taip pat yra funkcinių Vartotojo variantų DoubleConsumer IntConsumer ir LongConsumer . Šie variantai priima primityvias reikšmes kaip argumentus. 

Be šių variantų, yra dar vienas vartotojo sąsajos variantas, žinomas kaip Dvi vartotojas

Sintaksė:

Vartotojas vartotojas = (vertė) -> System.out.println(vertė);

Šis „Java Consumer“ funkcinės sąsajos įgyvendinimas atspausdina reikšmę, perduotą kaip parametrą spausdinimo sakiniui. Šis įgyvendinimas naudoja „Java“ funkciją „Lambda“.

2. Predikatas 

The Predikatų sąsaja reiškia vieno argumento loginę funkciją. Jis dažniausiai naudojamas srautų filtravimo operacijoms. Kaip ir vartotojo funkcinė sąsaja, „Predicate“ funkcinė sąsaja taip pat turi tam tikrų plėtinių. Tai yra IntPredicate DoublePredicate ir Ilgasis Predikatas . Šio tipo predikatinės funkcinės sąsajos kaip argumentus priima tik primityvius duomenų tipus arba reikšmes.  

Sintaksė: 

viešoji sąsaja Predikatas {
   loginis testas(T t);
}

Java predikato funkcinė sąsaja taip pat gali būti įgyvendinta naudojant Lambda išraiškas.

Predikatas predikatas = (reikšmė) -> reikšmė != nulis;

3. Funkcija

A funkcija yra „Java“ funkcinės sąsajos tipas, kuris gauna tik vieną argumentą ir grąžina reikšmę po reikalaujamo apdorojimo. Daugelis skirtingų funkcijų sąsajų versijų yra instrumentinės ir dažniausiai naudojamos primityviuose tipuose, pavyzdžiui, double int long.

Sintaksė:

Funkcija funkcija = (reikšmė) -> reikšmė * reikšmė;

  • Dvi funkcija: The Dvi funkcija yra iš esmės susijęs su funkcija. Be to, reikia dviejų argumentų, o funkcija priima vieną argumentą. 
  • Unarinis operatorius ir dvejetainis operatorius: Taip pat yra dvi kitos funkcinės sąsajos, kurios pavadintos kaip Unary Operator ir Dvejetainis operatorius. Jie abu atitinkamai išplečia funkciją ir dvigubą funkciją, kai tiek įvesties, tiek išvesties tipai yra vienodi.

4. Tiekėjas

The Tiekėjas funkcinė sąsaja taip pat yra funkcinės sąsajos tipas, kuris nepriima jokios įvesties ar argumentų ir vis tiek grąžina vieną išvestį. Įvairūs tiekėjo funkcinės sąsajos plėtiniai turi daugybę kitų tiekėjų funkcijų, pvz BooleanSupplier DoubleSupplier LongSupplier ir IntSupplier . Visų šių tolesnių specializacijų grąžinimo tipas yra tik atitinkami primityvai. 

Sintaksė:

Tiekėjas tiekėjas = () -> 'Sveikas pasaulis!';

Pavyzdys: Predikato sąsajos naudojimas eilutėms filtruoti

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

Išvestis
Geek GeeksQuiz Geek2  

Funkcinių sąsajų lentelė

Funkcinės sąsajos

Aprašymas

Metodas

Paleisti

Tai reiškia užduotį, kurią gali atlikti gija.

tuščias paleidimas ()

Palyginti

Jame palyginami du objektai užsakymui.

int palyginti Su(T o)

ActionListener

Jis tvarko veiksmo įvykį įvykiais pagrįstame programavime.

anuliuotas veiksmas, atliktas (veiksmo įvykis e)

Galima skambinti

Tai reiškia užduotį, kuri gali grąžinti rezultatą arba padaryti išimtį.

V call() meta Išimtį

Vartotojas

Jis priima vieną įvesties argumentą ir nepateikia rezultato.

negaliojantis priėmimas (T t)

Predikatas

Jis priima vieną argumentą ir pateikia loginį rezultatą.

Būlio testas (T t)

Funkcija

Jis priima vieną argumentą ir pateikia rezultatą.

R taikyti (T t)

Tiekėjas

Tai nereikalauja jokių argumentų, bet duoda rezultatą.

Gauti ()

BiConsumer

Jis priima du argumentus ir nepateikia rezultato.

negalioja priėmimas (T t U u)

BiPredicate

Jis priima du argumentus ir pateikia loginį rezultatą.

Būlio testas (T t U u)

BiFunction

Jis priima du argumentus ir pateikia rezultatą.

R taikyti (T t U u)

UnaryOperator

Tai ypatingas funkcijos atvejis, kai įvesties ir išvesties tipai yra vienodi.

T taikyti (T t)

Dvejetainis operatorius

Tai ypatingas BiFunction atvejis, kai įvesties ir išvesties tipai yra vienodi.

T taikyti (T t1 T t2)

Susiję straipsniai

  • Java 8
  • Java Lambda išraiškos