Collections Kotlin进程并行收集?

Collections Kotlin进程并行收集?,collections,parallel-processing,kotlin,kotlinx.coroutines,Collections,Parallel Processing,Kotlin,Kotlinx.coroutines,我有一个对象集合,需要对其执行一些转换。目前我正在使用: var myObjects: List<MyObject> = getMyObjects() myObjects.forEach{ myObj -> someMethod(myObj) } var myObjects:List=getMyObjects() myObjects.forEach{myObj-> someMethod(myObj) } 它工作得很好,但我希望通过并行运行someMethod()来

我有一个对象集合,需要对其执行一些转换。目前我正在使用:

var myObjects: List<MyObject> = getMyObjects()

myObjects.forEach{ myObj ->
    someMethod(myObj)
}
var myObjects:List=getMyObjects()
myObjects.forEach{myObj->
someMethod(myObj)
}
它工作得很好,但我希望通过并行运行
someMethod()
来加速它,而不是等待每个对象完成,然后再开始下一个对象

在科特林有没有办法做到这一点?可能是使用
doAsyncTask
或其他什么

我知道这在什么时候是不可能的,但是现在Kotlin有了类似于
doAsyncTask
的协同程序,我很好奇是否有任何协同程序可以帮助你解决这个问题

List<MyObjects> items = getList()

Observable.from(items).flatMap(object : Func1<MyObjects, Observable<String>>() {
    fun call(item: MyObjects): Observable<String> {
        return someMethod(item)
    }
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : Subscriber<String>() {
    fun onCompleted() {

    }

    fun onError(e: Throwable) {

    }

    fun onNext(s: String) {
        // do on output of each string
    }
})
List items=getList()
可观察的.from(items).flatMap(对象:Func1(){
趣味呼叫(项目:MyObject):可观察{
返回方法(项目)
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(对象:Subscriber()){
乐趣未完成(){
}
有趣的人(e:可丢弃){
}
fun onNext(s:String){
//对每个字符串的输出执行以下操作
}
})

通过订阅
Schedulers.io()
,可以在后台线程上调度某些方法。

Java流在Kotlin中使用起来很简单:

tasks.stream().parallel().forEach { computeNotSuspend(it) }
但是,如果您使用的是Android,那么如果您希望应用程序与低于24的API兼容,就不能使用Java8

您还可以按照建议使用协同程序。但到目前为止(2017年8月),它还不是该语言的一部分,您需要安装一个外部库。有非常好的

在我的4核计算机上的输出:

Coroutine: 1037 ms
Stream parallel: 7150 ms

如果在两个
compute
函数中取消对
println
的注释,您将看到在非阻塞协同程序代码中,任务是按正确的顺序处理的,但不是使用流处理的。

是的,这可以使用协同程序来完成。以下函数对集合的所有元素并行应用操作:

fun <A>Collection<A>.forEachParallel(f: suspend (A) -> Unit): Unit = runBlocking {
    map { async(CommonPool) { f(it) } }.forEach { it.await() }
}

并行映射可以以类似的方式实现,请参见。

该问题可能重复一年半,并且在引入Kotlin协程之前就被问到了launch()协程可能会执行此任务。此外,您可以始终使用Java并行流当前无法访问“CommonPool”-它在“kotlinx.Coroutines”中是内部的!
Coroutine: 1037 ms
Stream parallel: 7150 ms
fun <A>Collection<A>.forEachParallel(f: suspend (A) -> Unit): Unit = runBlocking {
    map { async(CommonPool) { f(it) } }.forEach { it.await() }
}
myObjects.forEachParallel { myObj ->
    someMethod(myObj)
}