
let
Aproveitando o exemplo apresentado na documentação do Kotlin, um uso comum do let
é o apresentado abaixo:
class Person(
val name: String,
var age: Int,
var city: String
) {
fun moveTo(city: String) {
this.city = city
}
fun incrementAge() {
this.age++
}
override fun toString(): String {
return "${this.name}, ${this.age}, ${this.city}"
}
}
fun main() {
Person("Alice", 20, "Amsterdam").let {
println(it.toString()) // Alice, 20, Amsterdam
it.moveTo("London")
it.incrementAge()
println(it.toString()) // Alice, 21, London
}
}
Além do acesso direto aos atributos e funções do objeto, a função let
também pode retornar um valor como resultado da execução do bloco. Nesse caso, a última linha do bloco poderá ser retornada como resultado. O próximo exemplo demonstra também a possibilidade de nomear o objeto dentro do bloco, removendo a ambiguidade do termo it
, que pode causar confusão:
class Person(
val name: String,
var age: Int,
var city: String
) {
override fun toString(): String {
return "${this.name}, ${this.age}, ${this.city}"
}
}
fun main() {
val personString: String = Person("Pedro", 18, "São Paulo").let { person ->
// O resultado da última linha do bloco é retornado com resultado do bloco
// Pode-se acessar os atributos através do nome atribuido para o objeto dentro do bloco
person.toString()
}
println(personString) // Pedro, 18, São Paulo
}
Por fim, um uso muito útil do let
é a execução do bloco apenas para objetos não-nulos. Para isso, basta utilizar o safe call operator (operador de chamada segura) da seguinte forma:
class Person(
val name: String,
var age: Int,
var city: String
) {
fun incrementAge() {
this.age++
}
}
fun main() {
// declaramos o objeto person como null
val person: Person? = null
// Erro, pois o objeto person é nulo nesse ponto
// person.incrementAge()
person?.let {
// Sem problemas, pois garantimos que o objeto person não é nulo com o uso do ?.let{ }
it.incrementAge()
}
}
Referências
Kotlin Scope Functions. Acesso em 09 de Agosto de 2022.