在Kotlin中计算移动平均的最快/最简单的方法是什么?

我可以考虑一些肮脏的方法来计算Kotlin的移动平均线,但我不确定哪一个是最好的。 我知道kotlin有很多有趣的功能可以用于收藏和列表。 您认为最有效(或最简单)的方法来计算移动平均线?

Kotlin 1.2将引入一个滑动窗口 ,您可以明显地与average结合。

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

在此之前,你将不得不引入你自己的滑动序列。

 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) 

PS。 我没有看过Kotlin 1.2 windowed实现的代码,但是由于该函数立即进行了转换,我猜测结果并不是懒惰的,在自我实现的情况下,它是一个懒惰的结果,所以你需要实际上用类似.toList()东西枚举序列来获得实际的值。