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. }
  8. val list = listOf(1, 2, 3, 4, 5)
  9. 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. }
  7. }).start()
  8. Thread({
  9. for (j in 10..20) {
  10. println("J = $j")
  11. Thread.sleep(2000)
  12. }
  13. Thread.sleep(1000)
  14. }).start()
  15. }

一个输出:

  1. I = 1
  2. J = 10
  3. I = 2
  4. I = 3
  5. ...
  6. J = 20