首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin学习之高阶函数和Lambda表达式:闭包

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属性即可。

学海无涯苦作舟

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171226G05VN500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券