函数
函数应该市不陌生了。在kotlin中使用fun
标志函数。标准格式如下,返回值为Unit
即空时,省略不写返回类型
1 | fun funName(param: ParamType): ReturnType{ |
说说和java中不一样的。也是其他现代语言基本有的特点
默认参数
允许默认参数值,减少重载函数的数量。调用时后项可以省略
1 | fun test(name: String, age: Int = 10) { |
具名参数
像php那样,不需要关注参数位置,通过按照按照参数名进行传递参数
1 | fun test(name: String, age: Int, mes: String) { |
在参数比较多时,使用具名参数,代码可读性大大提高
可变参数
可变长参数,java中也有,相当于一个变长的数组
1 | fun test(vararg strings: String) {} |
单表达式函数
在某些比较简单的函数体,可能是一个表达,此时函数可以进行简写,不需要写括号之类。虽然返回类型可以进行推断,但是为了可读性尽量描述返回类型。
1 | fun getMes(a: Int): String = if(a > 3) "a > 3" else "a <= 3" |
中缀表示法
标志使用infix
的函数是中缀函数
- 它们必须是成员函数或扩展函数;
- 它们必须只有一个参数;
- 其参数不得接受可变数量的参数且不能有默认值。
通过中缀表示可以写出类似自然语言的代码。比如kotlin内部的位操作,
1 | infix fun Int.shl(x: Int): Int { …… } |
局部函数
局部作用域也是可以声明函数的。局部函数可以访问外部函数的变量
1 | fun dfs(graph: Graph) { |
lambda表达式
在kotln的世界,函数使用非常频繁。函数可以作为一个个体进行传递,这就促生了一种用来描述函数类型的语言结构。而根据这个函数类型而描述的语言结构,除了函数,还有lambda。其实二者几乎可以等同。
函数类型
函数类型通常描述为(A,B) -> C
这样的结构,即参数加返回值。为了方便阅读,括号尽量加上。
1 | val action: ((String) -> String) = { string -> |
这个就是一个简单的函数类型声明的函数变量,而对于函数变量的赋值的就是括号后面的lambda表达式,第一行用于书写参数,最后一行用于书写返回值。不需要return
而函数和lambda也是可以赋值的。
1 | val action: ((String) -> String) = { string -> |
充分的说明了在kotlin,函数可以像一个变量一样传递使用。这样称之为函数字面值
匿名函数
函数字面值除了lambda可以实例,同样使用匿名函数也是可以实例的
1 | val action4: (String) -> String = fun (string: String):String { |
总结来说,匿名函数和lambda都属于为声明的函数。匿名函数可读较好,lambda较为简洁。
lambda内部存在一个it
参数,指代单参数。即在lambda的第一行可以不写参数名,内部使用it
代替
1 | val action: ((String) -> String) = { |
结合扩展
既然lambda是一种特殊的函数,当然也是可以使用扩展的,于是也能够获取到this
而且当函数的最后一个参数为函数类型时,可以将lambda写到括号外,如下
1 | fun test(name: String, action: (String -> Unit)) { |
于是就出现了以代码方式书写UI代码。
1 | class HTML { |