我需要做平行平面地图。 假设我有以下代码:
val coll: List<Set<Int>> = ...
coll.flatMap{set -> setOf(set, set + 1)}
我需要这样的东西:
coll.pFlatMap{set -> setOf(set, set + 1)} // parallel execution
答案 0 :(得分:4)
Kotlin不提供任何开箱即用的线程。 但是您可以使用kotlinx.coroutines进行如下操作:
val coll: List<Set<Int>> = ...
val result = coll
.map {set ->
// Run each task in own coroutine,
// you can limit concurrency using custom coroutine dispatcher
async { doSomethingWithSet(set) }
}
.flatMap { deferred ->
// Await results and use flatMap
deferred.await() // You can handle errors here
}
答案 1 :(得分:0)
或者,您也可以不使用协程:
fun <T, R> Collection<T>.pFlatMap(transform: (T) -> Collection<R>): List<R> =
parallelStream().flatMap { transform(it).stream() }.toList()
该解决方案要求JDK 8或更高版本上的Kotlin。
您还可以使其更通用(类似于Kotlin的flatMap
):
fun <T, R> Iterable<T>.pFlatMap(transform: (T) -> Iterable<R>): List<R> =
toList()
.parallelStream()
.flatMap { transform(it).toList().stream() }
.toList()