Kotlin: let, run, with, also ou apply?

Como escolher a Scoping Function que você precisa?

Você quer fazer um código Kotlin bonitão usando Scoping Function, mas percebe que todas as opções são muito parecidas, certo? Nada melhor do que exemplos para poder assimilar. Aqui vão alguns para ajudar :)

Precisa transformar algo? let, run e with

Para os exemplos de let, run e with a seguir considerem o Pair:

val attributes = Pair("Tony Stark", 30)

E a classe Pessoa

data class Person(
val name: String,
val age: Int,
var profession: String? = null,
var nickname: String? = null
)

let

Retorna qualquer valor a partir de um objeto do qual o escopo se originou e refere-se a esse objeto como it.

run

Retorna qualquer valor a partir de um objeto do qual o escopo se originou e refere-se a esse objeto como this.

with

Retorna qualquer valor a partir de um objeto do qual o escopo se originou e refere-se a esse objeto como this

Pareci repetitiva? Pois é! Todos os exemplos pegam um Pair e transformam em um objeto do tipo Pessoa. Esses 3 scoping functions tem o mesmo propósito.


Não precisa transformar, apenas trabalhar com um objeto de forma mais organizada? apply e also

Para os exemplos de apply e also, considerem esse objeto daquela mesma classe Pessoa lá de cima:

val person = Person("Tony Stark", 30)

apply

Retorna o próprio objeto do qual partiu o escopo e dentro desse escopo o objeto é referido como this

also

Retorna o próprio objeto do qual partiu o escopo e dentro desse escopo o objeto é referido como it


Não curtiu tantos it? Nas funções que usarem it você pode nomeá-lo da forma que quiser:

Não curtiu tantos this? Funções que usam this você pode omiti-lo :)


Validação de Nullables

Um uso muito bacana para Scoping Functions é quando você precisa operar em algum objeto que pode ser nulo:

A função mapToPerson aceita um objeto não nulo, validando desta forma com o “?.let” garantimos que ela só será chamada se houver algum valor na variável attPair.


“This” externo e “this” do escopo, como usar?

Nas Scoping Functions que fazem uso do this como o apply, run e with, caso precise recuperar o this externo ao escopo do bloco basta informar de qual escopo ele pertence usando o this@ .

Já nas Scoping Functions que fazem uso do it não há necessidade, pois o this acessado dentro do bloco já é referente ao escopo externo.


Ainda na dúvida? Tem esse resuminho

Podem conferir esse post da Nicole Borrelli que está super bacana de entender também!

😉