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

  • Capture y guarde la image con Kotlin en Android Studio
  • Kotlin - Dagger 2 no está inyectando objects
  • Kotlin JPA: cómo lidiar con la initialization de @OneToOne
  • Kotlin: ¿Cómo puede una class secundaria usar la function de extensión de un padre en la llamada del super constructor?
  • Broadcast Reciver en kotlin
  • Encabezados HTTP no devueltos en EC2
  • Gradle Project Sync falló, Kotlin
  • ¿Cómo implementar una propiedad floja en Kotlin que requiere otra propiedad?
  • Métodos sobrecargados que reciben funciones de order superior en Kotlin
  • Enlace de datos de Kotlin y Android (BuildTools 2.0.0)
  • ¿Por qué no hay palabras key de concurrency en Kotlin?