Interfacce funzionali
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 39 di 87.
Un'interfaccia funzionale è un'interfaccia che contiene esattamente un metodo astratto. Questo vincolo di un solo metodo rende speciali le interfacce funzionali, perché possono essere implementate usando espressioni lambda, consentendo uno stile di programmazione più conciso.
Java fornisce l’annotazione @FunctionalInterface per contrassegnare esplicitamente un’interfaccia come funzionale. Sebbene sia facoltativa, questa annotazione aiuta il compilatore a individuare gli errori se aggiungi accidentalmente un secondo metodo astratto:
@FunctionalInterface
public interface Calculator {
int calculate(int a, int b);
}Puoi implementare un'interfaccia funzionale nel modo tradizionale con una classe, oppure in modo più conciso con un'espressione lambda:
// Implementazione tradizionale
Calculator adder = new Calculator() {
@Override
public int calculate(int a, int b) {
return a + b;
}
};
// Espressione lambda (molto più breve!)
Calculator adder = (a, b) -> a + b;
System.out.println(adder.calculate(5, 3)); // 8Le interfacce funzionali possono comunque avere metodi predefiniti e metodi statici, poiché questi non rientrano nella regola del singolo metodo astratto. Il pacchetto java.util.function di Java fornisce molte interfacce funzionali integrate, come Predicate, Function e Consumer, che incontrerai spesso quando lavorerai con stream e collezioni.
Sfida
FacileCreiamo un sistema di trasformazione delle stringhe usando interfacce funzionali ed espressioni lambda. Creerai un processore di testo flessibile che può applicare diverse trasformazioni alle stringhe: il tutto usando una singola interfaccia funzionale.
Organizzerai il codice in tre file:
StringTransformer.java: definisci un'interfaccia funzionale che rappresenta qualsiasi operazione di trasformazione di una stringa. Contrassegnala con l'annotazione@FunctionalInterfaceper assicurarti che rimanga funzionale. L'interfaccia deve dichiarare un solo metodo astratto chiamatotransform, che accetta una String e restituisce una String.TextProcessor.java: crea una classe che usa la tua interfaccia funzionale per elaborare il testo. Deve avere un campo che contenga unStringTransformere un costruttore per inizializzarlo. Includi un metodo chiamatoprocess(String text)che applica il trasformatore al testo fornito e restituisce il risultato. Questo approccio ti permette di passare qualsiasi comportamento di trasformazione tramite il costruttore.Main.java: metti insieme tutti gli elementi creando diverse trasformazioni usando espressioni lambda. Riceverai due input: una stringa di testo e un tipo di operazione (upper,loweroreverse).In base al tipo di operazione, crea un
TextProcessorcon la lambda appropriata:upper: trasforma il testo in maiuscololower: trasforma il testo in minuscoloreverse: inverte il testo (suggerimento: usaStringBuilder)
Quindi chiama
process()con il testo di input e stampa il risultato in questo formato:Result: [transformed text]
Riceverai due input: il testo da trasformare (String) e il tipo di operazione (String).
Nota come la stessa classe TextProcessor può eseguire operazioni completamente diverse a seconda della lambda che le passi: questa è la potenza delle interfacce funzionali!
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
String operation = scanner.nextLine();
TextProcessor processor;
// TODO: In base al tipo di operazione, crea un TextProcessor con la lambda appropriata:
// - "upper": trasforma il testo in maiuscolo
// - "lower": trasforma il testo in minuscolo
// - "reverse": inverte il testo (suggerimento: usa StringBuilder)
// TODO: Chiama process() con il testo di input e stampa il risultato
// Formato dell'output: "Result: [transformed text]"
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online