METHOD REFERENCE vs LAMBDA
Un method reference è una forma abbreviata di lambda che richiama direttamente un
metodo già esistente.
Serve solo quando la lambda non aggiunge logica, ma si limita a chiamare un metodo.
1️⃣ Tipi principali di method reference
Tipo Esempio con lambda Versione con method Significato
reference
A. Metodo (x, y) -> [Link](x, Math::max Richiama un
statico y) metodo statico di
una classe.
B. Metodo () -> [Link]() a::suona Richiama un
d’istanza su un metodo di un
oggetto oggetto già
specifico esistente.
C. Metodo (s1, s2) -> String::compareTo Il primo
d’istanza su [Link](s2) parametro
parametro chiama il metodo
sul secondo.
D. Costruttore () -> new Studente() Studente::new Crea un nuovo
oggetto usando il
costruttore.
2️⃣ Esempi pratici
A. Metodo statico
Comparator<Integer> cmp = (a, b) -> [Link](a, b);
// equivalente a:
Comparator<Integer> cmp2 = Integer::compare;
B. Metodo d’istanza su oggetto specifico
class Allarme {
void suona() { [Link]("Allarme!"); }
}
Allarme a = new Allarme();
Runnable r = () -> [Link]();
// equivalente a:
Runnable r = a::suona; // method reference valido
[Link](); // stampa "Allarme!"
C. Metodo d’istanza sul parametro
Comparator<String> cmp = (a, b) -> [Link](b);
// equivalente a:
Comparator<String> cmp2 = String::compareToIgnoreCase;
D. Costruttore
Supplier<Studente> s1 = () -> new Studente();
// equivalente a:
Supplier<Studente> s2 = Studente::new;
3️⃣ Quando si può usare
Puoi sostituire una lambda con un method reference solo se:
● la lambda chiama direttamente un metodo già esistente;
● i tipi dei parametri e del valore di ritorno coincidono con quelli del metodo.
Se nella lambda fai altro (es. operazioni aggiuntive o condizioni), non puoi sostituirla.
4️⃣ Esercizi brevi per capire
1. Comparator<String> cmp = (a, b) -> [Link](b); → diventa
String::compareTo.
2. Runnable r = () -> saluta(); → diventa NomeClasse::saluta.
3. Supplier<Double> s = () -> [Link](); → diventa Math::random.
4. Consumer<String> c = s -> [Link](s); → diventa
[Link]::println.
5. Supplier<Studente> s = () -> new Studente(); → diventa
Studente::new.