Lambda

什么是Lambda?

  • 其实就是匿名函数

写法

  • {[参数列表]->[函数体,最后一行是返回值]}

类型举例

  • ()->Unit 
  • 无参。返回值为Unit
  • (Int)->Int
  • 传入整型,返回一个整型
  • (String,(String->String)->Boolean)
  • 传入字符串、Lambda表达式。返回Boolean

调用

  • 用()调用
  • 等价于invoke()

简化

  • 函数参数调用时最后一个Lambda可以移出去
  • 函数参数只有一个Lambda。调用时小括号可以省略
  • Lambda只有一个参数可默认为it
  • 入参、返回值与形参一致的函数可以用函数引用的方式作为实参传入

 

 

 

package com.yzdzy.kotlin
//(Array<String>) -> Unit
fun main(args: Array<String>) {


var sum = { arg1: Int, arg2: Int ->
println("$arg1+$arg2=${arg1 + arg2}")
//最后一行 为返回值
arg1 + arg2
}

println(sum(2, 4))
//相等于这个
println(sum.invoke(2, 4))
//()-> Unit 匿名函数就是lambda
var printLnHello = {
println("Hello")
}
//匿名函数也有类型
//(Int) -> Long
//有名的函数 类型 ()-> Unit
fun printUsage(){
println("请传入两个整型参数,例如1 2")
}
//println 类型 (Any?)->Unit 传入可空。返回 Lambda

// 请按照顺序阅读代码 当前是1
println("1------------------")

for (i in args) {
println(i)
}
println("2------------------")
args.forEach {
println(it)
}
println("3------------------")
//如果最后一个参数是lambda
args.forEach({ it ->
println(it)
})
println("4------------------")
// 可以把小括号移动到前面 如果前面小括号里面什么都没有还可以删除掉
args.forEach() { it ->
println(it)
}
println("5------------------")
//如果传入的函数和需要接受的lambda的参数是一样的
// alt+enter 使用 convert lambda 可以简化到下面
args.forEach(::println)
//遍历输入 如果是x 终止迭代 加标签的方式 终止当前的迭代
println("7------------------")
args.forEach ForEach@{
if (it == "x") return@ForEach
//retrun 的是main 函数 所有下面的7------------执行不到
println(it)
}

println("6------------------")
println("9------------------")
//Function2<java.lang.Integer, java.lang.Integer, java.lang.Integer>
println(sum)

// 可以全局搜索下Function2
/*
* /** A function that takes 2 arguments. */
public interface Function2<in P1, in P2, out R> : Function<R> {
/** Invokes the function with the specified arguments. */
public operator fun invoke(p1: P1, p2: P2): R
}*/

println(printLnHello)
println("10------------------")
//function printUsage (Kotlin reflection is not available)
println(::printUsage)
//true 所以是Function0
println(::printUsage is ()->Unit)
// 类是从 Function0-22个 根据参数的个数
//那么问题来了 当参数大于22呢 23个参数的函数呢、、编译不会报错
// 但是运行会报错 但是我们一般不会传递这么多参数


args.forEach {
if (it == "x") return
//retrun 的是main 函数 所有下面的7------------执行不到
println(it)
}

println("8------------------")

}