asyncAll()という拡張関数を作ってKotlinのリスト操作の中で並列処理を実行する

前回の記事でawaitAll()を使ったリスト操作の中で並列処理を実行した結果の待ち合わせについて書きました。

tkhs0604.hatenablog.com


その中で、並列処理を実行するときに毎回map { async { hoge() } }と書くのは辛いと思ったので、asyncAll()という拡張関数を作りました。

第1引数としてリスト、第2引数として並列処理を実行したい関数を受け取り、その関数をasync()の中で実行しているだけです。

fun <T, R> CoroutineScope.asyncAll(
  items: Iterable<T>,
  func: suspend (T) -> R
): Collection<Deferred<R>> {
  return items.map { async { func(it) } }
}


上記の拡張関数を使うと、前回の記事のサンプルコードの並列処理は以下のように簡略化できます。
記述量がそこまで減るわけではないですが、意図は分かりやすくなるかなと個人的には思いました。

// before
val time1 = measureTime {
  val result = list.map { async { lazy(it) } }.awaitAll()
}

// after
val time1 = measureTime {
  val result = asyncAll(list) { lazy(it) }.awaitAll()
}