Я написал эту вспомогательную функцию, чтобы я мог легко обрабатывать список параллельно и продолжать выполнение кода только после завершения всей работы. Это прекрасно работает, когда вам не нужно возвращать результат.
(я знаю, что не всегда рекомендуется создавать новые пулы, его можно легко удалить, но я хотел чтобы примеры были простыми.)
fun recursiveAction(action: () -> Unit): RecursiveAction {
return object : RecursiveAction() {
override fun compute() {
action()
}
}
}
fun <T> List<T>.parallelForEach(parallelSize: Int, action: (T) -> Unit) {
ForkJoinPool(parallelSize).invoke(recursiveAction {
this.parallelStream().forEach { action(it) }
})
}
Пример использования:
val myList: List<SomeClass> [...]
val parallelSize: Int = 8
myList.parallelForEach(parallelSize) { listElement ->
//Some task here
}
Есть ли способ создать аналогичную вспомогательную конструкцию для случаев, когда вы хотите собрать результаты обратно в список?
Я знаю, что должен использовать RecursiveTask вместо RecursiveAction, но мне не удалось написать вспомогательную функцию, как я делал выше, чтобы обернуть ее.
Я хотел бы использовать это так:
val myList: List<SomeClass> [...]
val parallelSize: Int = 8
val result: List<SomeClass> = myList.parallelForEach(parallelSize) { listElement ->
//Some task here
}
В качестве альтернативы, есть ли более простой способ сделать это вообще?