Каков самый быстрый или простой способ расчета скользящего среднего в Котлине?

Я могу подумать о некоторых грязных способах расчета скользящей средней на Котлине, но я не уверен, какой из них лучше. Я знаю, что у kotlin есть много интересных функций для работы с коллекциями и списком. Как вы считаете, самый эффективный (или самый простой) способ расчета скользящей средней?

Kotlin 1.2 представит скользящее окно, которое можно совместить со average очевидно.

 val data = listOf(1,2,5,6,2,7,8,5,9) // 3 "period" moving average val movingAverage = data.windowed(3,1,List<Int>::average) // OR val movingAverage = data.windowed(3,1) { it.average() } 

До тех пор вам придется представить свою собственную скользящую последовательность.

 class SlidingSequence<out T>(val source: Iterable<T>, val slideSize: Int, val slideStep: Int) : Sequence<List<T>> { override fun iterator(): Iterator<List<T>> = object : AbstractIterator<List<T>>() { private val iterator = if (slideSize > 0) source.iterator() else emptyList<T>().iterator() private var buffer = listOf<T>() override fun computeNext() = when { iterator.hasNext() -> { buffer = buffer.drop(slideStep).let { it + iterator.asSequence().take(slideSize - it.size) } setNext(buffer) } else -> done() } } } fun <T> Iterable<T>.windowed(size: Int, step: Int = 1): Sequence<List<T>> { return SlidingSequence(this, size, step) } // and then you can do val data = listOf(1,2,5,6,2,7,8,5,9) // 3 "period" moving average val movingAverage = data.windowed(3).map(List<Int>::average) 

PS. Я не смотрел код windowed реализации Kotlin 1.2, но поскольку функция принимает немедленное преобразование, я предполагаю, что результат не ленив, где в самоисполненном случае выше это ленивый результат, поэтому вам нужно на самом деле перечислите последовательность с чем-то вроде .toList() чтобы получить фактические значения.