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

  • Extraña java.lang.ClassCastException al usar la llamada
  • Carga concurrente de files S3 a través de Koutlin Coroutines
  • ¿Cómo se simula emitir 2 streams infinitas observables y tener otras observables que las fusionan y amortiguan cada 10 segundos?
  • Obteniendo datos de local y remoto simultáneamente usando RxJava
  • ¿Cómo actualizo kotlin-js-library a 1.1.3 como ha sido el plugin de kotlin-gradle?
  • ¿Cómo se pone la expresión lambda después de los parameters en un map para llamar a la syntax legal?
  • Kotlin utiliza el repository personalizado SpringData Jpa
  • ¿Cómo encadenar transformaciones en Android al usar datos en vivo?
  • Al declarar Byte en Kotlin se produce el error en time de compilation 'El integer integer no se ajusta al tipo esperado Byte'
  • Cómo restablecer FrameLayout o eliminar el caching de layout
  • ¿Por qué este código de Kotlin aún requiere? para acceder a los miembros?