Qual é a diferença entre launch/join e async/await em coroutines Kotlin?
Olá! Comecei a estudar coroutines em Kotlin e fiquei confuso com duas abordagens principais. Quando escrevo código, vejo que posso iniciar uma coroutine com `launch` e depois esperar sua conclusão com `join()`. E também tem `async` com `await()`. À primeira vista, eles fazem a mesma coisa — iniciam um trabalho em segundo plano e esperam o resultado. Mas sinto que existe uma diferença, e ela é importante.
Aqui está um exemplo simples, onde tento carregar dados de duas fontes e combiná-los. Com launch/join, fica assim:
```kotlin
fun main() = runBlocking {
var data1 = ""
var data2 = ""
val job1 = launch {
delay(1000) // simulação de carregamento
data1 = "Dados da API 1"
}
val job2 = launch {
delay(1000)
data2 = "Dados da API 2"
}
job1.join()
job2.join()
println("$data1 + $data2") // Funciona, mas não é bonito
}
```
E com async/await, faço assim:
```kotlin
fun main() = runBlocking {
val deferred1 = async {
delay(10