English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Espressione lambda Kotlin

Espressione lambda

Un'espressione lambda o lambda abbreviato è una funzione anonima; una funzione senza nome. Queste funzioni vengono passate come espressioni immediatamente senza bisogno di dichiarazione. Ad esempio:

fun main(args: Array<String>) {
    val greeting = { println("Hello!") }
    //Chiamare la funzione
    greeting()
}

L'output del programma è il seguente:

Ciao!

In questo caso, l'espressione lambda viene assegnata a una variabile greeting. Questa espressione non accetta alcun parametro e non restituisce alcun valore.

Allora, chiamare la funzione(lambda espressione) nel modo seguente:

greeting()

Esempio: Lambda con parametri e tipo di ritorno

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

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

L'output del programma è il seguente:

27

In questo caso, l'espressione lambda è:

Attenzione, all'interno delle parentesi graffe ci è una espressione lambda.

Funzioni di ordine superiore

Kotlin offre un forte supporto alla programmazione funzionale. Puoi passare una funzione come parametro a un'altra funzione. Inoltre, puoi restituire una funzione da un'altra funzione. Queste funzioni si chiamano funzioni di ordine superiore.

Per comodità, di solito si passa l'espressione lambda a una funzione di ordine superiore (piuttosto che a una funzione tipica).

Esempio: Passare Lambda a una funzione

Facciamo passare l'espressione lambda a una funzione di ordine superiore. Ecco il metodo di operazione.

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

L'output del programma è il seguente:

Ciao!

In questo caso, callMe() è una funzione di ordine superiore (poiché accetta una funzione come parametro). Il parametro greeting accetta la lambda passata alla funzione callMe():

 greeting: () -> Unit

Le parentesi vuote indicano che la funzione anonima non accetta alcun parametro. E la parola chiave Unit indica che la funzione anonima non restituisce alcun valore.

Le lambda espressioni vengono utilizzate spesso quando si lavora con insiemi. E ci sono diverse funzioni di libreria standard che possono essere utilizzate con lambda per semplificare il nostro lavoro. Vedrai alcuni esempi qui:

Esempio: funzione maxBy()

La funzione maxBy() restituisce il primo elemento che produce il valore massimo della funzione data; se non ci sono elementi, restituisce null.

data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
    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}" )
}

L'output del programma è il seguente:

Person(name=Jack, age=34)
name: Jack
age: 34

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

La parola chiave it: utilizzata per un singolo parametro

Nel programma sopra riportato, l'espressione lambda accetta solo un parametro (elenco di oggetti Person). In questo caso, puoi utilizzare la parola chiave it per fare riferimento al parametro.

Puoi

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

Equivalente a

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

Nel programma sopra riportato.

Esempio: funzioni maxBy() e startsWith()

Esempio: calcolo dell'età massima di una persona con nome che inizia con la lettera S

Utilizzeremo due funzioni di libreria maxBy() e startsWith() per completare questa operazione. Se la funzione startsWith() inizia con il carattere specificato come parametro, restituisce true.

data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
    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}" )
}

L'output del programma è il seguente:

Person(name=Shane, age=22)
name: Shane
age: 22