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

  • ¿Por qué Anko no puede ignorar el valor pasado de _id cuando _id es INTEGER + PRIMARY_KEY + AUTOINCREMENT?
  • ¿Es posible build una aplicación web completa de Node.js usando Kotlin?
  • Kotlin: ¿Mejor técnica de fusión de lists?
  • (número + "Es más de 5") No se está ejecutando "Error de concatenación"
  • Complemento de Jacoco Jenkins con Kotlin
  • Autenticación de formulario en Ktor
  • Cómo forzar que algún método sea visible solo para kotlin
  • Comstack el código de kotlin tanto para JVM como para JavaScript
  • Combinar / fusionar classs de datos en Kotlin
  • Clases de Kotlin sin llaves
  • usando Gson en kotlin para analizar json array