Un'interfaccia funzionale in Java è un'interfaccia che contiene solo un metodo astratto. Le interfacce funzionali possono avere più metodi predefiniti o statici ma solo un metodo astratto.
Da Java 8 in poi è possibile utilizzare espressioni lambda e riferimenti a metodi per rappresentare l'istanza di un'interfaccia funzionale.
Esempio: utilizzo di un'interfaccia funzionale con espressione Lambda
Javapublic class Geeks { public static void main(String[] args) { // Using lambda expression to implement Runnable new Thread(() -> System.out.println('New thread created')).start(); } }
Produzione
New thread created
Spiegazione:
- Il programma sopra mostra l'uso dell'espressione lambda con l'interfaccia funzionale Runnable.
- Runnable ha un metodo astratto run() quindi si qualifica come un'interfaccia funzionale.
- Lambda()-> System.out.println('Nuovo thread creato') definisce il metodo run().
- new Thread().start() avvia un nuovo thread che esegue il corpo lambda
Nota:
UN F l'interfaccia funzionale può anche estendere un'altra interfaccia funzionale.
@FunctionalInterface Annotazione
L'annotazione @FunctionalInterface viene utilizzata per garantire che l'interfaccia funzionale non possa avere più di un metodo astratto. Nel caso in cui siano presenti più metodi astratti, il compilatore contrassegna un messaggio "Annotazione @FunctionalInterface inaspettata". Tuttavia non è obbligatorio utilizzare questa annotazione.
Nota:
L'annotazione @FunctionalInterface è facoltativa ma è consigliabile utilizzarla. Aiuta a individuare l'errore nella fase iniziale assicurandosi che l'interfaccia abbia un solo metodo astratto.
Esempio: definizione di un'interfaccia funzionale con l'annotazione @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); } }
Produzione
25
Spiegazione :
- Square è un'interfaccia funzionale con un unico metodo calcola(int x).
- Un'espressione lambda (int x) -> x * x viene utilizzata per implementare il metodo di calcolo.
- Lambda prende x come input e restituisce x * x.
Interfacce funzionali Java prima di Java 8
Prima di Java 8 dovevamo creare oggetti di classe interna anonimi o implementare queste interfacce. Di seguito è riportato un esempio di come è stata implementata l'interfaccia Runnable prima dell'introduzione delle espressioni lambda.
Esempio: Programma Java per dimostrare l'interfaccia funzionale
Javaclass 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(); } }
Produzione
New thread created
Interfacce funzionali Java integrate
Da Java SE 1.8 in poi ci sono molte interfacce che vengono convertite in interfacce funzionali. Tutte queste interfacce sono annotate con @FunctionalInterface. Queste interfacce sono le seguenti:
- Eseguibile: Questa interfaccia contiene solo il file correre() metodo.
- Paragonabile: Questa interfaccia contiene solo il metodo compareTo().
- Ascoltatore di azioni: Questa interfaccia contiene solo il metodo actionPerformed().
- Chiamabile: Questa interfaccia contiene solo il metodo call().
Tipi di interfacce funzionali in Java
Java SE 8 includeva quattro tipi principali di interfacce funzionali che possono essere applicate in molteplici situazioni, come indicato di seguito:
- Consumatore
- Predicato
- Funzione
- Fornitore
1. Consumatore
IL interfaccia del consumatore dell'interfaccia funzionale è quella che accetta solo un argomento o un argomento gentrificato. L'interfaccia del consumatore non ha alcun valore di ritorno. Non restituisce nulla. Esistono anche varianti funzionali del Consumer DoppioConsumatore IntConsumatore E LongConsumer . Queste varianti accettano valori primitivi come argomenti.
Oltre a queste varianti esiste anche un'altra variante dell'interfaccia Consumer nota come Bi-consumo .
Sintassi:
Consumatore
consumatore = (valore) -> System.out.println(valore);
Questa implementazione dell'interfaccia funzionale Java Consumer stampa il valore passato come parametro all'istruzione print. Questa implementazione utilizza la funzione Lambda di Java.
2. Predicato
IL Interfaccia del predicato rappresenta una funzione con valore booleano di un argomento. Viene comunemente utilizzato per filtrare le operazioni nei flussi. Proprio come l'interfaccia funzionale del consumatore, anche l'interfaccia funzionale del predicato ha alcune estensioni. Questi sono IntPredicate Doppio predicato E Predicato lungo . Questi tipi di interfacce funzionali predicate accettano solo tipi di dati o valori primitivi come argomenti.
Sintassi:
interfaccia pubblica Predicato
{
test booleano(T t);
}
L'interfaccia funzionale del predicato Java può essere implementata anche utilizzando espressioni Lambda.
Predicato
predicato = (valore) -> valore != null; test e tipi di software
3. Funzione
UN funzione è un tipo di interfaccia funzionale in Java che riceve solo un singolo argomento e restituisce un valore dopo l'elaborazione richiesta. Molte versioni diverse delle interfacce delle funzioni sono strumentali e vengono comunemente utilizzate nei tipi primitivi come double int long.
Sintassi:
Funzione
funzione = (valore) -> valore * valore;
- Bifunzione: IL Bifunzione è sostanzialmente correlato ad una Funzione. Inoltre richiede due argomenti mentre Funzione accetta un argomento.
- Operatore unario e operatore binario: Ci sono anche altre due interfacce funzionali denominate come Operatore unario E Operatore binario. Entrambi estendono rispettivamente la funzione e la bifunzione dove sia il tipo di ingresso che il tipo di uscita sono gli stessi.
4. Fornitore
IL Fornitore l'interfaccia funzionale è anche un tipo di interfaccia funzionale che non accetta alcun input o argomento e tuttavia restituisce un singolo output. Le diverse estensioni dell'interfaccia funzionale Fornitore contengono molte altre funzioni dei fornitori come BooleanSupplier DoubleSupplier LongSupplier E IntSupplier . Il tipo restituito di tutte queste ulteriori specializzazioni sono solo le primitive corrispondenti.
Sintassi:
Fornitore
fornitore = () -> 'Ciao Mondo!';
Esempio: Utilizzo dell'interfaccia del predicato per filtrare le stringhe
Javaimport 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); } } }
Produzione
Geek GeeksQuiz Geek2
Tabella delle interfacce funzionali
Interfacce funzionali | Descrizione | Metodo |
|---|---|---|
Percorribile | Rappresenta un'attività che può essere eseguita da un thread. | corsa vuota() |
Paragonabile | Confronta due oggetti per l'ordinamento. | int confrontaTo(T o) |
ActionListener | Gestisce un evento di azione nella programmazione guidata dagli eventi. | azione nullaEseguita(ActionEvent e) |
Chiamabile | Rappresenta un'attività che può restituire un risultato o generare un'eccezione. | V call() genera un'eccezione |
Consumatore | Accetta un singolo argomento di input e non restituisce alcun risultato. | accettare nullo(T t) |
Predicato | Accetta un singolo argomento e restituisce un risultato booleano. | test booleano(T t) |
Funzione | Accetta un singolo argomento e restituisce un risultato. | R applicare(T t) |
Fornitore | Non richiede argomenti ma fornisce un risultato. | T ottenere() |
Biconsumatore | Accetta due argomenti e non restituisce alcun risultato. | annullare l'accettazione(T t U u) |
BiPredicate | Accetta due argomenti e restituisce un risultato booleano. | test booleano(T t U u) |
Bifunzione | Accetta due argomenti e restituisce un risultato. css per centrare un'immagine | R applicare(T t U u) |
UnaryOperator | Questo è un caso speciale di Funzione in cui i tipi di input e output sono gli stessi. | T applicare(T t) |
Operatore Binario | Questo è un caso speciale di BiFunction in cui i tipi di input e output sono gli stessi. | T applicare(T t1 T t2) |
Articoli correlati
- Giava8
- Espressioni Lambda Java