해당 경우도 Coroutine을 이용해서 처리하면 됩니다. Pararell decomposition이라고 하는 기법입니다. async를 여러개 동시에 실행할 경우 동시에 처리가 되는 특성을 이용해서 아래 같이 처리할 수 있습니다.
fun main() = runBlocking {
val result = data.map {
async { B(it) }
}.awaitAll()
}
이걸 extension function으로 만들어 사용하면 아래처럼 가능합니다.
suspend fun <A, B> Iterable<A>.asyncMap(f: suspend (A) -> B): List<B> = coroutineScope {
map { async { f(it) } }.awaitAll()
}
fun main() = runBlocking {
val convertedList = data.asyncMap { B(it) }
}
coroutineScope함수는 이 함수를 호출한 Corotuine의 context를 그대로 상속받기 때문에 위처럼 사용할 수 있습니다.
참고로 위 함수를 실행할 때는 Dispatchers.IO나 Distpachters.Default를 사용하시는 걸 권장드려요.
Edit: 중복함수 제거