logo

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ą.



dvejetainis medis vs bst

@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.

java masyvo dalis

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ėjastiekė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į

padaryti scenarijų vykdomąjį

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

java pridėti prie masyvo

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