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------------------")
}