8.2.12 闭包(Closure)
Lambda 表达式或者匿名函数,以及局部函数和对象表达式(object declarations)可以访问其 闭包,即在外部作用域中声明的变量。 与 Java 不同的是可以修改闭包中捕获的变量:
1. fun sumGTZero(c: Iterable<Int>): Int {
2. var sum = 0
3. c.filter { it > 0 }.forEach {
4. sum += it
5. }
6. return sum
7. }
9. val list = listOf(1, 2, 3, 4, 5)
10. sumGTZero(list) // 输出 15
我们再使用闭包来写一个使用Java中的Thread接口的例子:
1. fun closureDemo() {
2. Thread({
3. for (i in 1..10) {
4. println("I = $i")
5. Thread.sleep(1000)
6. }
8. }).start()
10. Thread({
11. for (j in 10..20) {
12. println("J = $j")
13. Thread.sleep(2000)
14. }
15. Thread.sleep(1000)
16. }).start()
17. }
一个输出:
1. I = 1
2. J = 10
3. I = 2
4. I = 3
5. ...
6. J = 20
