Kotlin Lambdas

Espressioni lambda

L'espressione lambda o semplicemente lambda è una funzione anonima; una funzione senza nome. Queste funzioni vengono passate immediatamente come un'espressione senza dichiarazione. Per esempio,

 fun main(args: Array) ( val greeting = ( println("Hello!")) // invoking function greeting() )

Quando esegui il programma, l'output sarà:

 Ciao!

Qui, un'espressione lambda viene assegnata alla variabile saluto. L'espressione non accetta alcun parametro e non restituisce alcun valore in questo programma.

Quindi, la funzione (espressione lambda) viene richiamata come:

 saluto() 

Esempio: Lambda con parametri e tipo restituito

Il programma seguente ha un'espressione lambda che accetta due numeri interi come parametri e restituisce il prodotto di questi due numeri interi.

 fun main(args: Array) ( val product = ( a: Int, b: Int -> a * b ) val result = product(9, 3) println(result) )

Quando esegui il programma, l'output sarà:

 27

Qui, l'espressione lambda è:

Nota, un'espressione lambda è racchiusa tra parentesi graffe.

Funzione di ordine superiore

Koltin ha un ottimo supporto per la programmazione funzionale. È possibile passare funzioni come argomenti ad altre funzioni. Inoltre, puoi restituire una funzione da altre funzioni. Queste funzioni sono chiamate funzioni di ordine superiore.

Spesso, le espressioni lambda vengono passate a una funzione di ordine superiore (piuttosto che a una funzione tipica) per comodità.

Esempio: passaggio di Lambda a Function

Passiamo un'espressione lambda a una funzione di ordine superiore. Ecco come puoi farlo.

 fun callMe(greeting: () -> Unit) ( greeting() ) fun main(args: Array) ( callMe(( println("Hello!") )) )

Quando esegui il programma, l'output sarà:

 Ciao!

Ecco callMe()una funzione di ordine superiore (perché prende la funzione come parametro). Il parametro di saluto accetta il lambda passato alla callMe()funzione come:

 saluto: () -> Unità

La parentesi vuota suggerisce che la funzione anonima passata non accetta alcun parametro. E la Unitparola chiave suggerisce che la funzione anonima non restituisce alcun valore.

I lambda vengono spesso utilizzati mentre si lavora con le raccolte. Inoltre, nella libreria standard sono disponibili diverse funzioni integrate che accettano lambda per semplificare il nostro compito. Vedrai un paio di esempi qui:

Esempio: funzione maxBy ()

La funzione maxBy () restituisce il primo elemento che produce il valore più grande della funzione data o nullse non ci sono elementi.

 data class Person(val name: String, val age: Int) fun main(args: Array) ( val people = listOf( Person("Jack", 34), Person("Shelly", 19), Person("Patrick", 13), Person("Jill", 12), Person("Shane", 22), Person("Joe", 18) ) val selectedPerson = people.maxBy(( person -> person.age )) println(selectedPerson) println("name: $(selectedPerson?.name)" ) println("age: $(selectedPerson?.age)" ) )

Quando esegui il programma, l'output sarà:

 Persona (nome = Jack, età = 34) nome: Jack età: 34

Qui, la maxBy()funzione prende un elenco di oggetti Person e restituisce l'oggetto Person con età massima.

Parola chiave: utilizzata per il parametro singolo

Nel programma precedente, l'espressione lambda accetta solo un parametro (un elenco di oggetti Person). In questi casi, puoi fare riferimento all'argomento utilizzando la parola chiave it.

Puoi sostituire

 val selectedPerson = people.maxBy ((person -> person.age))

con

 val selectedPerson = people.maxBy ((it.age)) 

nel programma sopra.

Esempio: funzione maxBy () e startsWith ()

Il programma seguente calcola l'età massima di un oggetto Persona che inizia con la lettera S.

Useremo due funzioni di libreria maxBy()e startsWith()per eseguire questa operazione. La funzione starsWith () restituisce truese inizia con il carattere specificato passato come argomento.

 data class Person(val name: String, val age: Int) fun main(args: Array) ( val people = listOf( Person("Jack", 34), Person("Shelly", 19), Person("Patrick", 13), Person("Jill", 12), Person("Shane", 22), Person("Joe", 18) ) val selectedPerson = people .filter ( it.name.startsWith("S") ) .maxBy( it.age ) println(selectedPerson) println("name: $(selectedPerson?.name)" ) println("age: $(selectedPerson?.age)" ) )

Quando esegui il programma, l'output sarà:

 Persona (nome = Shane, età = 22) nome: Shane età: 22

Letture consigliate

  • Chiusure Kotlin
  • Kotlin With e applica

Articoli interessanti...