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

Expressão Lambda Kotlin

Expressão lambda

Expressão lambda ou abreviadamente lambda é uma função anônima; função sem nome. Essas funções são passadas imediatamente como expressões sem necessidade de declaração. Por exemplo,

fun main(args: Array<String>) {
    val greeting = { println("Hello!")}
    //Chamar função
    greeting()
}

A saída do programa será:

Hello!

Aqui, a expressão lambda é atribuída à variável greeting. A expressão não aceita nenhum parâmetro e não retorna nenhum valor no programa.

Em seguida, chame a função (expressão lambda) da seguinte forma:

greeting()

Exemplo: Lambda com parâmetros e tipo de retorno

O programa a seguir possui uma expressão lambda que aceita dois inteiros como parâmetros e retorna o produto desses inteiros.

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

A saída do programa será:

27

Aqui, a expressão lambda é:

Atenção, o que está entre chaves contém uma expressão lambda.

Funções de ordem superior

Koltin oferece suporte poderoso para programação funcional. Você pode passar uma função para outras funções como parâmetro. Além disso, você pode retornar uma função de outras funções. Essas funcionalidades são chamadas de funções de ordem superior.

Por conveniência, geralmente passamos expressões lambda para funções de ordem superior (em vez de funções típicas).

Exemplo: passar Lambda para função

Vamos passar a expressão lambda para funções de ordem superior. Este é seu método de operação.

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

A saída do programa será:

Hello!

Aqui, callMe() é uma função de alto nível (porque aceita uma função como parâmetro). O parâmetro greeting aceita a Lambda passada para a função callMe():

 greeting: () -> Unit

Parenteses vazios indicam que a função anônima não aceita nenhum parâmetro. E a palavra-chave Unit indica que a função anônima não retorna nenhum valor.

A lambda é frequentemente usada ao lidar com conjuntos. E a biblioteca padrão tem várias funções built-in que podem usar lambda para simplificar nossa tarefa. Você verá alguns exemplos aqui:

Exemplo: função maxBy()

A função maxBy() retorna o primeiro elemento que gera o valor máximo da função dada; se não houver elementos, retorna 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}" )
}

A saída do programa será:

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

Aqui, a função maxBy() obtém a lista de objetos Person e retorna o objeto Person com a maior idade.

Palavra-chave it: para parâmetro único

No programa acima, a expressão lambda aceita apenas um parâmetro (lista de objetos Person). Neste caso, pode-se usar a palavra-chave it para referenciar o parâmetro.

Você pode

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

Equivalente a

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

No programa acima.

Exemplo: funções maxBy() e startsWith()

Abaixo está o programa que calcula a idade máxima do objeto Person que começa com a letra S.

Vamos usar duas funções de biblioteca maxBy() e startsWith() para completar esta tarefa. Se a função startsWith() começar com o caractere especificado como parâmetro, retorna 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}" )
}

A saída do programa será:

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