¿Cuál es la forma más rápida / más simple de calcular una media mobile en Kotlin?

Puedo pensar en algunas maneras sucias de calcular una media mobile en Kotlin, pero no estoy seguro de cuál es la mejor. Sé que kotlin tiene muchas características interesantes para trabajar con collections y lists. ¿Cuál crees que es la forma más eficiente (o la más simple) de calcular una media mobile?

Solutions Collecting From Web of "¿Cuál es la forma más rápida / más simple de calcular una media mobile en Kotlin?"

Kotlin 1.2 presentará una window deslizante que se puede combinar con la average obviamente.

 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() } 

Hasta entonces, tendrías que introducir tu propia secuencia deslizante.

 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) 

PD. No he analizado el código de la implementación de windowed de Kotlin 1.2, pero dado que la function toma una transformación inmediata, supongo que el resultado no es flojo, donde en el caso auto implementado arriba es un resultado flojo, por lo que necesita enumere la secuencia con algo como .toList() para get los valores reales.