在Scala中,可以轻松地执行并行映射,forEach等,其中:
collection.par.map(..)
在Kotlin有同等学历吗?
Kotlin标准库不支持并行操作.但是,由于Kotlin使用标准Java集合类,因此您也可以使用Java 8流API在Kotlin集合上执行并行操作.
例如
myCollection.parallelStream() .map { ... } .filter { ... }
从Kotlin 1.1开始,并行操作在协同程序方面也可以表现得非常优雅.这是pmap
列表:
fun List.pmap(f: suspend (A) -> B): List = runBlocking { map { async(CommonPool) { f(it) } }.map { it.await() } }
请注意,协同程序仍然是一个实验性功能.
Kotlin的stdlib还没有官方支持,但您可以定义一个扩展函数来模仿par.map
:
funIterable .pmap( numThreads: Int = Runtime.getRuntime().availableProcessors() - 2, exec: ExecutorService = Executors.newFixedThreadPool(numThreads), transform: (T) -> R): List { // default size is just an inlined version of kotlin.collections.collectionSizeOrDefault val defaultSize = if (this is Collection<*>) this.size else 10 val destination = Collections.synchronizedList(ArrayList (defaultSize)) for (item in this) { exec.submit { destination.add(transform(item)) } } exec.shutdown() exec.awaitTermination(1, TimeUnit.DAYS) return ArrayList (destination) }
(github来源)
这是一个简单的用法示例
val result = listOf("foo", "bar").pmap { it+"!" }.filter { it.contains("bar") }
如果需要,它允许通过提供线程数甚至特定线程来调整线程java.util.concurrent.Executor
.例如
listOf("foo", "bar").pmap(4, transform = { it + "!" })
请注意,这种方法只允许并行化map
操作,不会影响任何下游位.例如,filter
在第一个示例中将运行单线程.但是,在许多情况下,只是数据转换(即map
)需要并行化.此外,将方法从上面扩展到Kotlin集合API的其他元素是很简单的.
从1.2版本开始,kotlin添加了一个符合JRE8 的流功能
因此,异步迭代列表可以像下面这样完成:
fun main(args: Array) { val c = listOf("toto", "tata", "tutu") c.parallelStream().forEach { println(it) } }