【发布时间】:2017-11-07 12:32:10
【问题描述】:
我试图强迫自己在 Kotlin 中使用函数式编程,并且尽可能避免使用可变变量。通常,对于单元返回函数的 ad hoc 测试,我只需在函数内部输入println() 的内容以查看它是否正常工作。但是对于这个测试,我需要积累一个字符串,然后最终使用assertEquals(...)。
像往常一样,我发现自己在封闭范围内声明了一个var,并使用+= 累积到其中。 有没有更实用的方法通过传递/链接一个函数并消除可变变量来做到这一点?这里有一些简化但说明性的代码:
inline fun <T> Iterable<T>.forEachFrom(beg:Int, act:(T)->Unit) {
var i=0; if (beg>=0) for (e in this) if (i++ >= beg) act(e)
}
fun main(args:Array<String>) {
val l = listOf("zero", "one", "two", "three", "four")
// print-to-screen test
l.forEachFrom(2){print("$it-")}; println()
// output: two-three-four-
// accumulate-in-var test
var s = ""
l.forEachFrom(2){s += "$it-"}; println(s)
// output: two-three-four-
// Is there a purely functional way, without declaring a mutable var?
// val s = l.forEachFrom(2){accumulator???("$it-")}
// - OR -
// val s = l.forEachFrom(2).accumulator???("$it-")
// println(s)
}
【问题讨论】:
标签: functional-programming kotlin