一.Null安全
在Java语言中,我们可以声明一个 引用类型变量 而不明确提供初始值。在这类情况下,系统会给这个变量初始化一个默认值。比如一个String类型的变量,默认值是null。
比如
private String mName;
因为全局变量mName是String类型的变量,且没有赋值。所以系统赋值一个默认值null。
但是,默认情况下,Kotlin变量不能持有null值。
比如 Kotlin中 如下代码无效
val languageName: String = null
要使变量持有null值,它必须是可为null类型。可以在变量类型后面加上 ? 后缀,将变量指定为可为 null。如下
val languageName: String? = null
指定 String? 类型后,可以为 languageName 赋予 String 值或 null。
二.条件语句
Kotlin 提供了几种实现条件逻辑的机制,其中最常见的是 if-else 语句。如下
代码
class KotlinActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin)
val result1 = generateAnswerString(10);
Log.d("KotlinActivity", "result1:$result1")
val result2 = generateAnswerString(20);
Log.d("KotlinActivity", "result2:$result2")
}
/**
* 自定义String返回值类型 且接收参数 方法
* */
private fun generateAnswerString(num: Int): String {
if (num <= 10) {
return "I have the answer."
} else {
return "The answer eludes me."
}
}
}
结果
D/KotlinActivity: result1:I have the answer.
D/KotlinActivity: result2:The answer eludes me.
说明
if (num <= 10) {
return "I have the answer."
} else {
return "The answer eludes me."
}
这个if-else本身没什么要讲的,是最基本的条件语句。但是区别于Java。Kotlin中对于这个条件语句有不同的写法。
具体有哪些不同呢?我们下面分析
1.可以省略每一个分支的return,而是把return关键字放到if前面即整个条件语句的前面。如下
return if (num <= 10) {
"I have the answer."
} else {
"The answer eludes me."
}
2.也可以不使用return,因为每个分支都是返回的String类型。所以在Kotlin中我们可以定义一个变量接收每个分支的结果。
val answerString: String = if (num <= 10) {
"I have the answer."
} else {
"The answer eludes me."
}
return answerString
注意
<1> AndroidStudio更推荐我们使用第一种写法。
<2> Kotlin不包含传统的三元运算符,而是倾向于使用条件表达式。
3. when 表达式
随着条件语句的复杂性不断增加 即if-else分支变多,AndroidStudio会推荐我们可以考虑将 if-else 表达式替换为 when表达式。比如
return when {
num == 10 -> "I have the answer."
num >= 20 -> "The answer is close."
else -> "The answer eludes me."
}
when表达式中 每个分支都由 一个条件、一个箭头 (->) 和 一个结果来表示。
如果箭头左侧的条件为 true,则会返回右侧的表达式结果。
请注意,执行并不是从一个分支跳转到下一个分支。
三.匿名函数
Kotlin中并非每个函数都需要一个名称。比如
private fun method(num: Int): String {
return "张三$num"
}
private:函数私有
fun:Kotlin语音函数关键字
method:函数名
num:函数入参
String:函数返回类型
某些函数通过 输入 和 输出 更直接地进行标识。这些函数称为“匿名函数”。您可以保留对某个匿名函数的引用,以便日后使用此引用来调用该匿名函数。比如
class KotlinActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin)
val stringLength: Int = stringLengthFunc("Android")
Log.d("KotlinActivity", "stringLength:$stringLength")
val number: String = intNumber(123456)
Log.d("KotlinActivity", "number:$number")
}
/**
* 匿名函数
*stringLengthFunc变量 包含对一个匿名函数的引用
* 输入值:String类型
* 输出值:Int类型
* */
val stringLengthFunc: (String) -> Int = { result ->
result.length
}
/**
* 匿名函数
*intNumber变量 包含对一个匿名函数的引用
* 输入值:Int类型
* 输出值:String类型
* */
val intNumber: (Int) -> String = { result ->
result.toString()
}
}
结果
D/KotlinActivity: stringLength:7
D/KotlinActivity: number:123456