
正常声明一个变量并且赋予类型val x : String x实际上这个类型不仅仅可以使用基本类型也可以是个函数类型那该如何表示函数类型例如表示一个接收String作为参数返回值为Int类型的函数类型的变量注意是以()-的形式来声明这个函数类型的var func :(String)-Int那既然变量可以接收函数类型那么函数参数应该也可以接收函数类型fun test (x :(String)-Int){ }变量的函数类型的返回值也可以是函数类型var x :(String)-((String)-Int)变量的函数类型的返回值的参数也可以是函数类型var x:(String)-((((String)- Int))- Int)如果觉得这样写很复杂可以给类型起别名换个名字typealias Re (String) - Int //在main之外写下面来看这种函数类型的参数到底怎么用(我理解这种变量其实就可以类似成函数来调用)首先第一种可以用具有相同参数和返回值类型的函数来引用它fun test(str: String): Int{ return 100 } var strTest :(String)- Int ::test //这里引用了test函数就相当于调用它了 println(strTest(x)) //会返回test里面的100要理解使用双冒号(::)创建函数引用的本质可以参考这篇文章(::)创建函数引用第二种可以用匿名函数来声明var strTest :(String)-Int fun(str: String): Int{ return 1 } println(strTest(x)) //就会调用这个匿名函数返回 1 了有没有更简单的写法呢有的第三种使用lambda表达式相当于省略了匿名函数var strTest :(String)- Int { 10 //默认最后一行为返回值 }但是如何来表示入参呢在lambda表达式里用it来表示其实就相当于var strTest :(String)-Int { it:String - 10 }测试var strTest :(String)-Int{ println(it) 10 }然后调用strTest(hotdog) //会输出hotdog println(strTest(hotdog))//会输出hotdog10这就是lambda表达式但如果有两个参数那就得手动指定参数的名字var strTest :(String,String)-Int { a,b- ab } //但是如果没有把每个参数都用到那没用到的参数可以用下划线替代_ var strTest :(String,String)-Int { a,_- a }上面提到了函数可以接收函数类型的参数这种函数称之为高阶函数那在调用高阶函数的时候自然就要把函数类型的变量作为实参给进去fun test(x :(String)- Int){ x(hello) } test(/*传入函数类型的参数*/)这样显然是麻烦的所以直接使用lambda表达式进行函数的调用test({ it: String- println(it) 10 }) //其实就是函数的调用只不过参数变成了用lambda表示的函数类型的参数当然也可以这么写也是合理的test(){ it: String- println(it) 10 ) //亦或是 test{ it: String- println(it) 10 } //去掉了小括号看到这可能就有点懵逼了其实我也是懵逼的经查阅资料后了解到了这个规则当函数的最后一个参数是函数类型时指调用时你可以把 lambda 写到小括号外面尾随 lambda。如果此时函数没有其他参数小括号可以省略。这是一个很重要的规范现在比如有这样一个函数fun test(a :Int , b :Int , x :(String)-Int){ }这是该怎么调用这个函数来分析一下首先最后一个参数是函数类型那lambda可以写小括号外面但此时还有其他参数那么就不能省略小括号即test(1,2){ it:String- 10 }嘞是对滴那如果最后一个参数不是函数类型的呢fun test(a:Int , x:(String)-Int , c:Int){ }这样的话lambda既不能写在小括号之外也不能省略小括号//调用 test(1,{/*在这里写lambda表达式*/},2)还有一点要注意 在lambda中不能直接使用return语句返回结果而是需要用到标签lambda 里不能直接用 return会直接返回外层函数。如果你想“从 lambda 里返回”就必须用标签val func1: (Int) - String test{ if (it 10) returntest 我是提前返回的结果 println(我是正常情况) 收到的参数为$it }returntest xxx 的意思是“结束这个标签为 test 的 lambda并返回 xxx”。