Параллельные операции над коллекциями Котлина?

В Scala можно легко выполнить параллельное отображение, для каждого и т. Д., С помощью:

collection.par.map(..) 

Есть ли эквивалент в Котлине?

    Стандартная библиотека Kotlin не поддерживает параллельные операции. Однако, поскольку Kotlin использует стандартные классы Java-классов, вы можете использовать API потока Java 8 для параллельных операций над коллекциями Kotlin.

    Официальной поддержки в stdlib Котлина пока нет, но вы можете определить функцию расширения для имитации par.map :

     fun <T, R> Iterable<T>.pmap( numThreads: Int = Runtime.getRuntime().availableProcessors() - 2, exec: ExecutorService = Executors.newFixedThreadPool(numThreads), transform: (T) -> R): List<R> { // 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<R>(defaultSize)) for (item in this) { exec.submit { destination.add(transform(item)) } } exec.shutdown() exec.awaitTermination(1, TimeUnit.DAYS) return ArrayList<R>(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 ) требует распараллеливания. Кроме того, было бы просто расширить подход сверху до других элементов API коллекции Котлина.

    Начиная с Kotlin 1.1, параллельные операции также можно выразить довольно элегантно с точки зрения сопрограмм . Вот pmap в списках:

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

    Обратите внимание, что сопрограммы все еще являются экспериментальной функцией.

    В настоящий момент нет. Если вы посмотрите на официальное сравнение Котлина с Scala, вы увидите

    Вещи, которые могут быть добавлены в Котлин позже:

    • Параллельные коллекции