当前位置:  开发笔记 > 编程语言 > 正文

Kotlin系列的并行操作?

如何解决《Kotlin系列的并行操作?》经验,为你挑选了4个好方法。

在Scala中,可以轻松地执行并行映射,forEach等,其中:

collection.par.map(..)

在Kotlin有同等学历吗?



1> yole..:

Kotlin标准库不支持并行操作.但是,由于Kotlin使用标准Java集合类,因此您也可以使用Java 8流API在Kotlin集合上执行并行操作.

例如

myCollection.parallelStream()
        .map { ... }
        .filter { ... }


如何在Kotlin中使用Java 8流API?
@LordScone就像你在Java中一样.例如:`myCollection.parallelStream().map {...}.过滤{...}`

2> Alex Krauss..:

从Kotlin 1.1开始,并行操作在协同程序方面也可以表现得非常优雅.这是pmap列表:

fun List.pmap(f: suspend (A) -> B): List = runBlocking {
    map { async(CommonPool) { f(it) } }.map { it.await() }
}

请注意,协同程序仍然是一个实验性功能.


很优雅吗?相反,我会说代码很难读。
有了Kotlin 1.3,这还是最好的答案吗?我注意到@ OlivierTerrien的Stream回答如下,但我更喜欢坚持使用Kotlin Sequences和Iterables.

3> Holger Brand..:

Kotlin的stdlib还没有官方支持,但您可以定义一个扩展函数来模仿par.map:

fun  Iterable.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的其他元素是很简单的.



4> OlivierTerri..:

从1.2版本开始,kotlin添加了一个符合JRE8 的流功能

因此,异步迭代列表可以像下面这样完成:

fun main(args: Array) {
  val c = listOf("toto", "tata", "tutu")
  c.parallelStream().forEach { println(it) }
}

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有