-
Notifications
You must be signed in to change notification settings - Fork 146
/
KotlinTip13.kt
94 lines (78 loc) · 1.73 KB
/
KotlinTip13.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package com.sw.kotlin.tip13
import com.sw.kotlin.tip8.JavaExample8.User
fun testNullType() {
val a: String = "aa"
/*
* a是非空类型,下面的给a赋值为null将会编译不通过
* */
//a = null
a.length
/*
* ?声明是可空类型,可以赋值为null
* */
var b: String? = "bb"
b = null
/*
* b是可空类型,直接访问可空类型将编译不通过,需要通过?.或者!!.来访问
* */
//b.length
b?.length
b!!.length
/*
* 不推荐这样的写法:链式的连续用!!.
* */
val user = User()
user!!.name!!.subSequence(0, 5)!!.length
}
fun testNullType2() {
val user: User? = User()
/*
* 每次访问都用用?.判断
* */
user?.name
user?.age
user?.toString()
/*
* 或者提前判断是否为空,如果不为空在这个分支里会自动转化为非空类型就可以直接访问了
* */
if (user != null) {
user.name
user.age
user.toString()
}
/*
* 还可以通过let语句,在?.let之后,如果为空不会有任何操作,只有在非空的时候才会执行let之后的操作
* */
user?.let {
it.name
it.age
it.toString()
}
}
/*
* 对空值的处理
* */
fun testElvis(input: String?, user: User?) {
val a: Int?
if (input == null) {
a = -1
} else {
a = input.length
}
if (user == null) {
var newOne = User()
newOne.save()
} else {
user.save()
}
}
fun User.save() {
//save user
}
/**
* Elvis操作符 ?: 简化对空值的处理
*/
fun testElvis2(input: String?, user: User?) {
val b = input?.length ?: -1;
user?.save() ?: User().save()
}