学习kotlin第11天_函数和lambda表达式
继续浏览,只能说是继续浏览了,根本就不是踩坑嘛,都踩不平。
坑1、第一天就见到fun关键字了,结果现在才告诉我这是声明函数,调用使用传统的“变量名=函数名(参数)”,调用成员函数用“点表示法”,参数列表用“name:type=value”表示法并用逗号隔开。这文档,已经无力吐槽。
坑2、中缀表示法调用函数时函数需要满足是成员函数或者扩展函数、只有一个参数、用infix标注。
infix fun Int.sss(x: Int): Int {
return x+this
}
fun main(args: Array<String>) {
3 sss 2// 用中缀表示法调用扩展函数
3.sss(2) // 等同于这样
println(3 sss 2)
}
其中,3需要和函数所扩展的对象同类型,在该函数中可以用this取得,2为参数x。
坑3、override标记的函数参数列表不能有默认值。
坑4、使用默认参数调用函数时,需按顺序传入最后一个无默认值的参数及其之前的所有参数。如下:需按序传入other及其之前的参数。故建议把有默认值的参数靠后,无默认值的靠前,以便调用。当然,也可以在调用时指定参数名,这样就不用管顺序了。
fun reformat(str: String = "",
normalizeCase: Boolean = true,
upperCaseFirstLetter: Boolean = true,
divideByCamelHumps: Boolean = true,
other: Int,
wordSeparator: Char = 'c') {
}
fun main(args: Array<String>) {
reformat("", true, true, true, 10)
reformat(other = 10, str = "")
}
坑5、函数返回值为Unit类型时可以不声明并且省略return关键字。反之,其它具有块代码体的函数都得显示指定返回类型,因为kotlin不推断具有块代码体的返回类型。
坑6、单表达式函数可以省略花括号,如返回值类型可推断时可以省略返回值声明。
fun double(x: Int) = x * 2
坑7、可以用vararg定义可变参数。在下面的demo中,可变参数为数组,故如果已经定义好一个数组,可使用伸展操作符*直接传入。此外,若有多个参数,使用命名参数语法传入。
fun <T> asList(vararg ts: T, sa: Int): List<T> {
val result = ArrayList<T>()
for (t in ts) // ts is an Array
result.add(t)
return result
}
fun main(args: Array<String>) {
val list = asList(1, 2, 3, sa = 100)
val a = arrayOf(1, 2, 3)
val list2 = asList(4, 5.6, *a, sa = 100)
}
坑8、在前面提到过,kotlin的函数不依靠于类,可以在顶层也可以声明在局部作用域作为成员函数或者扩展函数。局部函数可以访问外部函数的局部变量。
坑9、成员函数是定义在类或者对象内的函数,用“点表示法”来调用。
坑10、泛型函数在函数名前用尖括号声明。
fun <T> singletonList(item: T): List<T> {
return listOf(item)
}
坑11 、尾递归函数用tailrec标记。。。不懂,递归就递归嘛,还来个啥子尾递归。
坑12、高阶函数是将函数作为参数或者返回值的函数。调用时使用“::”操作符进行调用或者传入一个lambda表达式。
fun <T> lock(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
} finally {
lock.unlock()
}
}
坑13、lambda表达式总是被大括号括着。(哟呵,终于开始介绍lambda表达式了)
坑14、如果函数最后一个参数为lambda表达式,可以在圆括号以外指定它。
坑15、如果函数字面值只有一个参数,那么可以省略声明并用“it”来指代。
坑16、下划线用于未使用的变量的地方。
额。。。这天气太热了,一不小心就睡着了,醒来都头晕乎乎的,后面的一句话也描述不上来,等明天再看一遍。。。
还没有评论,来说两句吧...