DEV Community

Cover image for Utilizando Closures como Callbacks em Kotlin
Victor Goulart
Victor Goulart

Posted on

Utilizando Closures como Callbacks em Kotlin

No post de hoje falarei brevemente sobre funções em Kotlin e como utiliza-las para Callback de eventos.

Funções

Funções em Kotlin são o que chamamos de "First-class function", ou seja, possuem suporte para passagem de funções como argumento para outras funções, podendo atribuir a variáveis ou armazenando em estruturas de dados.

Eventos

Em um contexto assíncrono é muito comum utilizar Callback para "escutar" os eventos e assim executar algo quando esse evento for chamado. Dessa forma a maneira mais tradicional de fazer isso seria criando uma interface para o callback e ao receber a resposta da execução notificar esse callback.
O exemplo a seguir simula um usuário fazendo o pedido para um Food Delivery e ao ser notificado que o pedido foi entregue ele escreve o tipo de pedido que chegou:

class User(foodDelivery: FoodDelivery): FoodDeliveryListener {
    private val delivery = foodDelivery

    fun orderFood() {
        delivery.order(this)
    }

    private fun receiveDelivery(foodType: String) {
        print("Received a".plus(foodType))
    }

    override fun onDelivered(foodType: String) {
        receiveDelivery(foodType)
    }
}

class FoodDelivery() {
    fun order(callback: FoodDeliveryListener) {
        delay(100)
        callback.onDelivered("Hamburger")
    }
}

interface FoodDeliveryListener {
    fun onDelivered(foodType: String)
}
Enter fullscreen mode Exit fullscreen mode

Porém em um contexto simples como esse onde existe apenas uma função não precisamos criar uma interface e fazer todos esses passos, podemos resolver de uma forma mais simples utilizando o que chamamos de Closures ou Lambda.
Dessa forma no resultado final do exemplo, a função order() vai receber como parâmetro a função onDelivered que será implementada por quem chamar a função sem necessidade da interface:

class User(foodDelivery: FoodDelivery) {
    private val delivery = foodDelivery

    fun orderFood() {
        delivery.order { foodType ->
            receiveDelivery(foodType)
        }
    }

    private fun receiveDelivery(foodType: String) {
        print("Received a".plus(foodType))
    }
}

class FoodDelivery() {
    fun order(onDelivered: (String) -> Unit) {
        delay(100)
        onDelivered("Hamburger")
    }
}
Enter fullscreen mode Exit fullscreen mode

Obrigado pela atenção até aqui! Qualquer dúvida ou feedback pode entrar em contato comigo nas minhas redes sociais

Github
LinkedIn

Top comments (6)

Collapse
 
jrezzende profile image
jrezzende

brabo! no aguardo dos próximos posts

Collapse
 
goulartvic profile image
Victor Goulart

Valeuu meu mano <3

Collapse
 
diasandre profile image
André Dias da Silva

Parabéns meu rei, viva o kotlin!

Collapse
 
carolineignacio profile image
Caroline Ignácio

brabo d+

Collapse
 
teruyaharoldo profile image
Haroldo Shigueaki Teruya

Parabéns mano!

Collapse
 
goulartvic profile image
Victor Goulart

Valeuu mestre!