Kotlin 学习记录
1 | 本文只记录重要的或者与C/C++、Java 出入较大的内容 |
Lambda 表达式
语法
无参数的情况
1 | val fun1 = {9} //定义了一个返回了Int的函数 |
有参数的情况
1 | var value1 = 9 |
lambda
表达式总是被大括号括着
定义完整的Lambda
表达式如上面实例中的语法2,它有其完整的参数类型标注,与表达式返回值。当我们把一些类型标注省略的情况下,就如上面实例中的语法2的另外一种类型。当它推断出的返回值类型不为Unit
时,它的返回值即为->符号后代码段中的最后一个表达式的类型(如同if-else语句块中的返回值一样)
当函数的参数仅有一个Lambda表达式的时候可以省略参数的那个小括号
it
it不是关键字
it在高阶函数中的lambda表达式的参数只有一个的时候可以使用
it
来使用此参数。it
可表示单个参数的隐式名称例子:
1 | fun test(num1 : Int, bool : (Int) -> Boolean) : Int{ |
_
在使用Lambda
表达式的时候,可以用下划线表示未使用的参数,表示不处理这个参数。
1 | val map = mapOf<String,String>("key1" to "value1","key2" to "value2","key3" to "value3") |
匿名函数
1 | val test1 = fun (x:Int,y:Int) = x+y; //单表达式函数可以 = 替换 {} |
带接收者的函数字面值
匿名函数作为接收者类型
匿名函数语法允许直接指定函数字面值的接收者类型,如果你需要使用带接收者的函数类型声明一个变量。
1 | val iop = fun Int.(other:Int):Int = this + other |
Lambda表达式作为接收者类型
要用Lambda表达式作为接收者类型的前提是**接收着类型可以从上下文中推断出来
1 |
|
闭包
闭包,可以函数中包含函数。
- 携带状态
1 | 让函数返回一个函数,并携带状态值 |
- 引用外部变量,并改变外部变量的值
1 | var sum = 0 |
可空类型、空安全、非空断言
判空的方法,if-else / ?. 判断
1
2
3
4var str : String? = "12346"
str = null
println(str?.length) //输出null当一个函数/方法有返回值时,如果方法中的代码使用
?.
去返回一个值,那么方法的返回值的类型后面也要加上?
符号let操作符
let操作符作用:当使用?.符号时验证时忽略掉null
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22val arrTest : Array<Int?> = arrayOf(1,2,null,3,null,5,6,null)
// 传统写法
for (index in arrTest) {
if (index == null){
continue
}
println("index => $index")
}
// let写法
for (index in arrTest) {
index?.let { println("index => $it") }
}
/**
index => 1
index => 2
index => 3
index => 5
index => 6
*/Evils操作符
安全性操作符有三种:
?:
/!!
/as?
?:
1
2
3
4
5
6
7
8
9
10
11
12
13val testStr : String? = null
var length = 0
// 例: 当testStr不为空时,输出其长度,反之输出-1
// 传统写法
length = if (testStr != null) testStr.length else -1
// ?: 写法
length = testStr?.length ?: -1
println(length)!!
1
2
3val testStr : String? = null
println(testStr!!.length)
//如果变量为空,使用!!修饰,运行时会抛出空指针异常as
使用
as
进行强制转换,在不能转换时会抛出异常,而使用as?
则会返回null
,但不会抛出异常。