重要的事情说一遍,方法也是一个对象

lambda 是什么 ? 匿名函数 .(其底层还是通过invokedynamic指令来生成匿名类来实现。)

为什么要lambda ? 好看 ,简洁.还有呢 ,带来了闭包

在kotlin中 ,函数能作为参数使用

匿名函数 ,它是函数,需要被调用才能起作用(或者需要被回调 一个意思)

细说 Kotlin 的 Lambda 表达式https://juejin.im/entry/58a382da61ff4b0058ab4542
Lambda 表达式,早学早理解https://juejin.im/entry/59b8a8445188256c651e819c
Kotlin——高级篇(一):Lambda表达式详解https://juejin.im/post/5ab9a5ccf265da239f076284

Lambda和匿名函数它们有什么不一样呢?答案是,没有任何不同的地方。在JVM的角度来说,它们是一模一样的。无论是Java8还是Kotlin甚至是所有运行在JVM平台上的语言,它们的原理都是一样的,Lambda表达式只是匿名函数的一种高糖写法。那么什么样的匿名函数能用Lambda呢?答案是:只有一个方法的接口,也可以说是只有一个方法的匿名函数

image.png

  1. //既然他能作为参数使用,就能当做变量被 定义
  2. val lambda = {
  3. left: Int, right: Int
  4. ->
  5. left + right
  6. }
  7. println(lambda(2, 3))
  8. 等价
  9. println(lambda.invoke(2,3))
  1. (handler: RepositoryHandler) -> Unit(没有返回值) 定义格式
  2. it 约定的默认参数
  3. val addRepos: (handler: RepositoryHandler) -> Unit = {
  4. it.google()
  5. it.jcenter()
  6. }

闭包

Dart 的闭包和 JS、python 一个意思,是定义在方法里面的方法,其特性:

  • 闭包是一个对象
  • 闭包定义在其他方法内部
  • 闭包可以访问外部方法的布局变量,并持有其状态。这是闭包的最大用途,通过闭包的方式把一个方法内部的属性暴露出去,因为方法是可以返回方法的,Dart 中方法也是对象一样可以当做返回值处理

结果是不会骗人的,大家就把闭包看成是一个包含外层数据的匿名实现类,当成对象看就好理解了,这是最经典的一个例子

  1. // 闭包
  2. sum(){
  3. var num = 0;
  4. sum2(){
  5. num++;
  6. print(num);
  7. }
  8. return sum2;
  9. // 也可以这么写,匿名的方式用的最多
  10. return (){
  11. num++;
  12. print(num);
  13. };
  14. }
  15. // 多调用闭包几次
  16. void main(){
  17. Function a = sum();
  18. a();
  19. a();
  20. a();
  21. a();
  22. a();
  23. a();
  24. }
  25. ~~~~~~~~~~log~~~~~~~~~~
  26. 1
  27. 2
  28. 3
  29. 4
  30. 5
  31. 6