Kotlin - 函数解析

匿名函数


  • 定义时不取名字的函数,我们称之为匿名函数,匿名函数通常整体传递给其他函数,或者从其他函数返回。
  • 匿名函数对Kotlin来说很重要,有了它,我们能根据需要定制特殊规则,轻松定制标准库里的内置函数。
fun main(){
     val toal  = "Mississippi".count()
     println(total)
     val totals = "Mississippi".count({letter ->
     letter == 's'
   })
   println(totals)
}

函数类型与隐式返回


  • 匿名函数也有类型,匿名函数可以当做变量赋值给函数类型变量,就像其他变量一样,匿名函数可以在代码里传递。变量有类型,变量可以等于函数,函数也会有类型。函数的类型,由传入的参数和返回值类型决定。
  • 和具名函数不一样,除了极少数情况外,匿名函数不需要return关键字来返回数据,匿名函数会隐式或自动返回函数体最后一行语句的结果。
val blessingFunction:() -> String ={
    val holiday = "National Day."
    "Happy $holiday"
}
    println (blessingFunction())
}

函数参数


  • 和具名函数一样,匿名函数可以不带参数,也可以带一个或多个任何类型的参数,需要带参数时,参数的类型放在匿名函数的类型定义中,参数名则放在函数定义中。
val blessingFunction:(String) -> String ={name ->
    val holiday = "National Day."
    "$name, Happy $holiday"
}
    println (blessingFunction("Jack"))
}

it关键字


  • 定义只有一个参数的匿名函数时,可以使用it关键字来表示参数名。当你需要传入两个值参,it关键字就不能用了。
val blessingFunction:(String) -> String ={name ->
    val holiday = "National Day."
    "$it, Happy $holiday"
}
    println (blessingFunction("Jack"))
}

类型推断


  • 定义一个变量时,如果已把匿名函数作为变量赋值给它,就不需要显示指明变量类型了。
1638350551199.jpg
  • 类型推断也支持带参数对的匿名函数,但为了帮助编译器更准确地推断变量类型,匿名函数的参数名和参数类型必须有。
1638350842479.jpg

定义参数是函数的函数


  • 函数的参数是另外一个函数
1638351455203.jpg
  • 简略写法
    如果一个函数的lambda参数排在最后,或者是唯一的参数,那么扩住lambda值参的一对圆括号就可以省略。
1638351800475.jpg

函数内联


  • lambda可以让你更灵活的编写应用,但是灵活也是要付出代价的。
  • 在JVM上,你定义的Lambda会以对象实例的形式存在,JVM会为所有lambda打交道的变量分配内存,这就产生了内存开销。更糟的是,lambda的内存开销会带来严重的性能问题。幸运的是,kotlin有一种优化机制叫内联,有了内联,jvm就不需要使用lambda对象实例了,因而避免了变量内存分配。哪里需要使用lambda,编译器就会将函数体复制黏贴到哪里。
  • 使用 lambda的递归函数无法内联,因为会导致复制黏贴无限循环,编译会发出警告。

函数引用


  • 要把函数作为参数传给其他函数使用,除了传lambda表达式,kotlin还提供了其他方法,传递函数引用,函数引用可以把一个具名函数转换成一个值参,使用lambda表达式的地方,都可以使用函数引用。
函数引用.jpg

函数类型作为返回类型

  • 函数类型也是有效的返回类型,也就是说可以定义一个能返回函数的函数。
函数类型作为返回类型.jpg

闭包

  • 在Kotlin中,匿名函数能修改并引用定义在自己的作用域之外的变量,匿名函数引用着定义自身的函数里的变量,Kotlin中的lambda就是闭包。
  • 能接收函数或返回函数的函数又叫做高级函数,高级函数广泛应用于函数式编程当中。
闭包.jpg

lambda与匿名内部类

  • 为什么要在代码中使用函数类型?
    函数类型能让开发者少写模式化代码,写出更灵活的代码。Java8支持面向对象编程和lambda表达式,但不支持将函数作为参数传递给另一个函数或变量,不过Java的代替方案是匿名内部类。
lambda与匿名内部类.jpg

你可能感兴趣的:(Kotlin - 函数解析)