¿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?

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.

  • Clase de datos de Kotlin a JSON con Spring / Jackson
  • ¿Muchos modules pequeños o pocos modules grandes para get el mejor performance de compilation?
  • Habitación con Dagger en Kotlin: Dao es nulo, cuando se inyecta en una class
  • 'kapt.generateStubs' no es usado por el complemento 'kotlin-kapt'
  • ¿Hay alguna manera de ejecutar raw sql con la biblioteca expuesta de Kotlin?
  • Android DecimalFormat no formatea correctamente
  • constructor de escenas independiente para get el proyecto intellij
  • Cómo get el valor enum del tipo sin procesar a partir de una class enum y una cadena en kotlin
  • Cómo hacer la sum de elementos para la list múltiple en kotlin
  • Kotlin: ¿qué formatting usar para la documentation?
  • Kotlin recomienda la manera de anular el logging de un oyente con un SAM