logo

Java funksjonelle grensesnitt

Et funksjonelt grensesnitt i Java er et grensesnitt som bare inneholder én abstrakt metode. Funksjonelle grensesnitt kan ha flere standardmetoder eller statiske metoder, men bare én abstrakt metode.

Fra Java 8 og utover kan lambda-uttrykk og metodereferanser brukes til å representere forekomsten av et funksjonelt grensesnitt.

Eksempel: Bruk av et funksjonelt grensesnitt med lambdauttrykk

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

Produksjon
New thread created 

Forklaring:



  • Programmet ovenfor viser bruk av lambda-uttrykk med det funksjonelle grensesnittet Runnable.
  • Runnable har en abstrakt metode run() så den kvalifiserer som et funksjonelt grensesnitt.
  • Lambda ()-> System.out.println('Ny tråd opprettet') definerer run()-metoden.
  • new Thread().start() starter en ny tråd som kjører lambda-kroppen

Note:

EN f unctional interface kan også utvide et annet funksjonelt grensesnitt.

@FunctionalInterface Merknad

@FunctionalInterface-annotering brukes for å sikre at det funksjonelle grensesnittet ikke kan ha mer enn én abstrakt metode. I tilfelle mer enn én abstrakt metode er til stede, flagger kompilatoren en 'Uventet @FunctionalInterface annotation'-melding. Det er imidlertid ikke obligatorisk å bruke denne merknaden.

Note:

full huggorm

@FunctionalInterface-kommentar er valgfritt, men det er en god praksis å bruke. Det hjelper å fange opp feilen på et tidlig stadium ved å sørge for at grensesnittet bare har én abstrakt metode.

Eksempel: Definere et funksjonelt grensesnitt med @FunctionalInterface-annotering

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

Produksjon
25 

Forklaring :

  • Square er et funksjonelt grensesnitt med en enkelt metode calculate(int x).
  • Et lambda-uttrykk (int x) -> x * x brukes for å implementere beregningsmetoden.
  • Lambda tar x som input og returnerer x * x.

Java funksjonelle grensesnitt før Java 8

Før Java 8 måtte vi lage anonyme indre klasseobjekter eller implementere disse grensesnittene. Nedenfor er et eksempel på hvordan Runnable-grensesnittet ble implementert før introduksjonen av lambda-uttrykk.

Eksempel: Java-program for å demonstrere funksjonelt grensesnitt

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

Produksjon
New thread created 

Innebygde Java funksjonelle grensesnitt

Siden Java SE 1.8 og utover er det mange grensesnitt som er konvertert til funksjonelle grensesnitt. Alle disse grensesnittene er merket med @FunctionalInterface. Disse grensesnittene er som følger:

  • Kjørbar: Dette grensesnittet inneholder kun løp() metode.
  • Sammenlignbare: Dette grensesnittet inneholder bare compareTo()-metoden.
  • ActionListener: Dette grensesnittet inneholder bare actionPerformed()-metoden.
  • Ringbar: Dette grensesnittet inneholder bare call()-metoden.

Typer funksjonelle grensesnitt i Java

Java SE 8 inkluderte fire hovedtyper funksjonelle grensesnitt som kan brukes i flere situasjoner som nevnt nedenfor:

  1. Forbruker
  2. Predikat
  3. Funksjon 
  4. Leverandør

1. Forbruker 

De forbrukergrensesnitt av det funksjonelle grensesnittet er det som godtar bare ett argument eller et gentrifisert argument. Forbrukergrensesnittet har ingen returverdi. Det gir ingenting tilbake. Det finnes også funksjonelle varianter av Consumer DoubleConsumer IntConsumer og LongConsumer . Disse variantene aksepterer primitive verdier som argumenter. 

Annet enn disse variantene er det også en variant til av forbrukergrensesnittet kjent som Bi-forbruker

Syntaks:

Forbruker forbruker = (verdi) -> System.out.println(verdi);

Denne implementeringen av Java Consumer funksjonelle grensesnitt skriver ut verdien som sendes som en parameter til utskriftssetningen. Denne implementeringen bruker Lambda-funksjonen til Java.

2. Predikat 

De Predikatgrensesnitt representerer en boolsk-verdi funksjon av ett argument. Det brukes ofte for filtreringsoperasjoner i strømmer. Akkurat som Consumer funksjonelt grensesnitt har Predicate funksjonelle grensesnitt også noen utvidelser. Disse er IntPredicate DoublePredicate og LongPredicate . Disse typene funksjonelle predikatgrensesnitt aksepterer bare primitive datatyper eller verdier som argumenter.  

Syntaks: 

offentlig grensesnitt Predikat{
   boolsk test(T t);
}

Java-predikatets funksjonelle grensesnitt kan også implementeres ved hjelp av Lambda-uttrykk.

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

3. Funksjon

EN funksjon er en type funksjonelt grensesnitt i Java som mottar bare ett enkelt argument og returnerer en verdi etter den nødvendige behandlingen. Mange forskjellige versjoner av funksjonsgrensesnittene er instrumentelle og brukes ofte i primitive typer som double int long.

Syntaks:

Funksjon funksjon = (verdi) -> verdi * verdi;

  • Bi-funksjon: De Bi-funksjon er vesentlig knyttet til en funksjon. Dessuten krever det to argumenter, mens funksjon godtar ett argument. 
  • Unær operatør og binær operatør: Det er også to andre funksjonelle grensesnitt som er navngitt som Unær operatør og Binær operatør. De utvider begge funksjonen og bi-funksjonen, der både inngangstypen og utgangstypen er den samme.

4. Leverandør

De Leverandør funksjonelt grensesnitt er også en type funksjonelt grensesnitt som ikke tar noen input eller argument og likevel returnerer en enkelt utgang. De forskjellige utvidelsene av det funksjonelle leverandørgrensesnittet har mange andre leverandørfunksjoner som Boolean Supplier DoubleSupplier LongSupplier og IntSupplier . Returtypen for alle disse ytterligere spesialiseringene er kun deres tilsvarende primitiver. 

Syntaks:

Leverandørleverandør = () -> 'Hei verden!';

Eksempel: Bruke predikatgrensesnitt for å filtrere strenger

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

Produksjon
Geek GeeksQuiz Geek2 

Tabell over funksjonelle grensesnitt

Funksjonelle grensesnitt

Beskrivelse

Metode

Kjørbar

Det representerer en oppgave som kan utføres av en tråd.

void run()

Sammenlignbar

Den sammenligner to objekter for bestilling.

int compareTo(T o)

ActionListener

Den håndterer en handlingshendelse i hendelsesdrevet programmering.

void handlingUtført(ActionEvent e)

Ringbar

Det representerer en oppgave som kan returnere et resultat eller gi et unntak.

V call() kaster unntak

Forbruker

Den godtar et enkelt input-argument og returnerer ikke noe resultat.

void accept(T t)

Predikat

Den godtar et enkelt argument og returnerer et boolsk resultat.

boolsk test(T t)

Funksjon

Den godtar et enkelt argument og returnerer et resultat.

R gjelder(T t)

Leverandør

Det krever ingen argumenter, men gir et resultat.

T få()

BiConsumer

Den godtar to argumenter og gir ikke noe resultat.

void accept(T t U u)

Bipredikat

Den godtar to argumenter og returnerer et boolsk resultat.

boolsk test(T t U u)

Bifunksjon

Den godtar to argumenter og returnerer et resultat.

latex tekststørrelse

R gjelder(T t U u)

UnaryOperator

Dette er et spesielt tilfelle av funksjon der inngangs- og utgangstyper er de samme.

T gjelder (T t)

BinaryOperator

Dette er et spesialtilfelle av BiFunction der inngangs- og utgangstyper er de samme.

T gjelder (T t1 T t2)

Relaterte artikler

  • Java 8
  • Java Lambda-uttrykk