Kotlin: lambda e funzioni anonime

Le funzioni lambda sono funzione che possono essere chiamate senza essere legate ad un identificatore e quindi senza essere dichiarate. Sono un esempio di funzioni nidificate in quanto permettono l’accesso a variabili (non locali) della funzione contenitrice. Seppur annidiate,  le lambda sono generalmente non ricorsive. In Kotlin, le funzioni lambda sono definite all’interno di parentesi graffe. All’interno di queste troviamo i parametri della funzione (se necessari) e il corpo della funzione. Parametri e corpo della funzione lambda sono separati dall’operatore -> . Riassumendo quindi la sintassi generale è:

{ param1 : type1, param2 : type2, … , paramN : typeN -> //corpo della funzione}

Se vogliamo associare una variabile alla funzione lambda allora bisognerà dichiarala come

val nomeFunzione : (type1, type2, … , typeN) -> returnType = { param1 : type1, param2 : type2, … , paramN : typeN -> //corpo della funzione}

Dove returnType è il tipo di ritorno della funzione. Nel caso in cui non fosse espressamente indicato, Kotlin procede con la type inference. In particolare, nelle funzioni lambda, l’ultima espressione è trattata automaticamente come tipo di ritorno.

Trailing lambda

La funzione lambda con lo strascico o trailing lambda function è una particolare sintassi in cui ad una funzione ha come ultimo parametro una funzione (lambda), allora l’espressione della lambda passata come parametro alla funzione può essere portata al di fuori delle parentesi:

nomeFunzione{ param1, param2 -> //corpo della funzione}

questo in particolare è applicabile al caso in cui nomeFunzione abbia come unico parametro la funzione lambda:

nomeFunzione{ //corpo della funzione }

Lambda ad un solo parametro: it

E’ molto comune il caso in cui la funzione lambda ha un solo parametro. In questo caso si può snellire la sintassi omettendo la dichiarazione dei parametri e quindi dell’operatore ->. L’unico parametro verrà identificato dalla keyword it :

{ //corpo della funzione utilizzando it }

Valore di ritorno di una lambda

E’ possibile indicare esplicitamente il valore di ritorno di una funzione lambda utilizzando la keyword return. Un esempio di utilizzo sono queste due espressioni equivalenti:

ints.filter {
    val shouldFilter = it > 0
    shouldFilter
}

classico utilizzo della funzione lambda in cui il valore (e tipo) di ritorno è determinato dall’ultima espressione ovvero viene tornato un Boolean contenente il valore shouldFilter.

ints.filter {
    val shouldFilter = it > 0
    return@filter shouldFilter
}

In questo caso il valore shouldFilter viene tornato esplicitamente utilizzando il label filter.

Variabili non utilizzate nelle lambda

Può avvenire che alcune variabili non vengano utilizzate dalla lambda. In questo caso è possibile sostituire il nome ed il tipo della variabile con l’operatore _ . Esempio di utilizzo:

map.forEach { _, value -> println("$value!") }

Funzioni anonime

In Kotlin c’è una distinzione tra funzioni lambda e funzioni anonime (anonymus function). Queste ultime si differenziano dalla prime perché il tipo di ritorno è espressamente indicato. La sintassi è identica a quelle delle funzioni semplici ad eccezione del fatto che non viene indicato il nome della funzione:

fun (param1 : type1, param2 : type2, … , paramN : typeN) : returnType  = operation

o nel caso in cui il tipo di ritorno così come quello dei parametri in ingresso siano chiaramente determinabili automaticamente abbiamo la sintassi compatta:

fun (param) = operation

infine, per funzioni con più di un’espressione:

fun (param1 : type1, param2 : type2, … , paramN : typeN) : returnType { //corpo della funzione con return }

come detto in precedenza lambda e funzioni anonime possono modificare il valore delle variabili locali della funzione chiamante. Per maggiori informazioni visitate il sito https://kotlinlang.org/docs/lambdas.html .

Potrebbero interessarti anche...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.