所有的计算机程序总结起来只干了三件事情,顺序,条件,循环。 在Java中可以用 break, continue, return来进行循环控制,Kotlin中也是一样。 但是因为Kotlin有面向函数(闭包)的概念,情况有点不一样, 看看下面的代码输出结果是什么,
fun fooList() {
listOf(1, 2, 3, 4, 5).forEach {
if(it == 3) return
print(it)
}
print(" reach fooList() end")
}
fun fooAnonymous() {
listOf(1, 2, 3, 4, 5).forEach (fun(value: Int){
if(value == 3) return
print(value)
})
print(" reach fooAnonymous() end")
}
fun main(args: Array<String>) {
fooList()
fooAnonymous()
}
输出
12 1245 reach fooAnonymous() end
两个函数都是遍历1-5输出,在3的地方跳过。 不同的地方是 fooAnonymous()函数在 forEach() 中包了一个闭包(函数)。 这样输出结果就非常不同了。第一个函数直接跳出循环,而第二个只跳出了一次。
上面两个输出结果不同的原因是在于return的返回地方不同。 在Java耕耘多年的同学可能一时没弄明白,不过只要换一下思路就能理解这里面的原理了。 Kotlin是一种面向函数/对象的语言,在 fooAnonymous()函数的 forEach() 中我们传入了一个闭包, 这个闭包是个匿名函数(Java没有的概念),虽然看似return是从 fooAnonymous()中返回的,但因为匿名函数的存在,实际上 return是从匿名函数中返回的。 匿名函数接受 Int型参数,然后做了跟 fooList()一样的打印,并且在 value == 3的时候返回。 所以从 Java的角度可以看成下面这样子
fun fooAnonymous() {
listOf(1, 2, 3, 4, 5).forEach (function(it))
print(" reach fooAnonymous() end")
}
fun function(value : Int) {
if(value == 3)
return
}
Kotlin的闭包是非常好用的东西,不过对于初次转面向函数的同学可能坑略多,但只要上手了,这东西绝对是事半功倍的利器。