English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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()
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.
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).
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:
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.
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.
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