如何在Kotlin中进行平行flatMap?

时间:2018-09-14 09:38:42

标签: kotlin coroutine kotlinx.coroutines

我需要做平行平面地图。 假设我有以下代码:

val coll: List<Set<Int>> = ...
coll.flatMap{set -> setOf(set, set + 1)}

我需要这样的东西:

coll.pFlatMap{set -> setOf(set, set + 1)} // parallel execution

2 个答案:

答案 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()