Kotlin学习之高阶函数和Lambda表达式:闭包
一、闭包
闭包指Lambda表达式和匿名函数外部定义的局部变量,Kotlin支持Lambda表达式和匿名函数访问和修改闭包。
如果一个函数对外部数据没有任何影响,这样的函数是“纯函数”。很多数学函数都是纯函数,比如常见的加减乘除,都只与传入的参数有关,不影响任何外部数据;有些函数则会影响外部数据,比如集合的add()方法,会改变函数外部的集合数据,所以add()不是一个“纯函数”。
Kotlin支持Lambda表达式和匿名函数访问和修改闭包,意味着Kotlin的Lambda表达式和匿名函数可以不是纯函数。
Java8新增的Lambda表达式只支持访问声明为final的闭包,更不可能修改闭包。也就是说Java8的Lambda表达式必须是纯函数,这增强了Java数据的安全性,也限制了Java 8 Lambda表达式的作用。
Kotlin允许这样写:
上例为IntArray扩展了一个countPositive()方法,用来计算IntArray中大于0的元素的数量。首先定义了一个count变量,用来表示符合条件的元素数量;然后调用IntArray.filter()方法,它接受一个(Int)->Boolean类型的函数,过滤出所有符合条件的元素,再依次遍历符合条件的元素,计算它们的数量;最后返回数量。
可以在forEach()函数里修改了闭包count的值,因为Kotlin支持在Lambda表达式和匿名函数中访问和修改闭包。
上面函数最简洁高效的写法,应该是这样的:
因为filter函数返回一个,要计算数量的话,直接调用List的size属性即可。
学海无涯苦作舟
领取专属 10元无门槛券
私享最新 技术干货