特殊符号

?表示 是否允许空值的存在
!!表示 如果对象为null,那么系统一定会报异常!
?:表示 对象A ?: 对象B 表达式,意思为,当对象 A值为 null 时,那么它就会返回后面的对象 B。
::表示 Kotlin 中 双冒号操作符 表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法。
->表示 一般用于函数类型的连接符号
=====的区别 在Kotlin中,=== 表示比较对象地址,== 表示比较两个值大小。

高阶函数

一个函数如果参数类型是函数或者返回值类型是函数,那么这就是一个高阶函数。

函数类型其实就是将函数的 “参数类型” 和 “返回值类型” 抽象出来

例如:

1
var add(a:Int,b:Int) = a+b

他的函数类型就是(Int,Int)->Int
而高阶函数意味着他而已接受一个函数的参数,或者他返回一个函数。
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//在以下main函数中,将show函数传递给了showUserName作为参数使用。
//除了可以使用已存在的函数,也可以现写一个函数
//同样的,可以用lambda语法来写函数
fun main(){
showUserName("zfxt",::show)
//showUserName("zfxt",fun(s:String){println(s)})
//showUserName("zfxt",{s:String->println(s)})
//过长的lambda语法函数可以写在()外面,如下
//showUserName("zfxt") {s:String->println(s)}
}
fun show(s: String) = println(s)
fun showUserName(name:String,show:(String)->Unit){
show(name)
}

内联函数(inline)

一般情况下,调用函数。也就是将程序执行顺序转移到内存中存放该函数的位置,执行完后,再返回现场重新执行原本的内容。其中转换过程都是采用压栈和出栈的方式。而对于那些频繁调用的函数,将会有很大的时间和空间开销,因此使用内联函数,他的作用就是将函数体直接放在主进程内。用空间开销换时间开销。

  • 支持 return 退出函数
  • 禁止内联:noinline
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 在 main() 中调用 makeTest()
    fun main() {
    Log.i("zc_test", "main() start")
    makeTest()
    Log.i("zc_test", "main() end")
    }
    // 内联函数 makeTest()
    private inline fun makeTest() {
    Log.i("zc_test", "makeTest")
    }

Lambda表达式

他是定义匿名函数的简单形式

1
val sum = {x:Int,y:Int -> x+y}

其中,参数声明放在->前面,函数体放在->后面
还可以将可选标注先留下

1
val sum:(Int,Int)->Int = {x,y->x+y}

在kotlin中,如果一个函数的最后一个参数是lambda表达式,那么可以直接将表达式写在括号外面。
如果只有一个参数,那么直接省略小括号。