
1. 扩展函数:
Kotlin的扩展函数允许在不直接修改现有类代码的情况下增加新的函数。这在你无法修改类或希望代码干净有序的情况下非常实用。
// 扩展函数示例 1
fun View.gone(){
visibility =View.GONE
}
fun View.visible(){
visibility =View.VISIBLE
}
// 使用
textView.hide()
// 扩展函数示例 2
// 该扩展函数将字符串的首字母大写
fun String.capitalizeFirstLetter(): String {
if (isEmpty()) return this
return substring(0, 1).toUpperCase() + substring(1)
}
// 使用
fun main() {
val input = "this is kotlin"
val outputString = input.capitalizeFirstLetter()
println(outputString)
}
// 输出: This is kotlin
2. 使用 let, run, apply, 和 also 扩展功能: Kotlin作用域函数
选择合适的作用域函数,请参考以下表格
函数上下文返回值let:"this"lambda函数的结果apply:"this"当前上下文对象with:"this"lambda函数的结果run:"this"lambda函数的结果also:"it"当前上下文对象
详情参考《Kotlin技巧:作用域函数let、run、with、apply和also》
3. 高阶函数
在Kotlin中,可以接受函数作为参数的函数或者可以返回函数的函数被称为高阶函数。
fun add(a: Int, b: Int): Int{
var sum = a + b
return sum
}
// higher-order function definition
fun higherfunc(addfunc:(Int,Int)-> Int){
// invoke regular function using local name
var result = addfunc(3,6)
print("The sum of two numbers is: $result")
}
fun main(args: Array) {
// invoke higher-order function
higherfunc(::add)
}
// output::The sum of two numbers is: 9
4. 使用when表达式
- 在Kotlin中,when的工作方式和其他语言中的switch很相似,但是它更加智能和灵活。
- 使用 Kotlin 的一件很酷的事情是,不需要像其他语言(如 Java)那样添加中断break。一旦找到匹配项,它就会运行该代码并从 when 块继续。
- 替换冗长的“if-else-if”链,以获得更清晰的条件逻辑。
示例 1:范围
val age = 20
when (age) {
in 18..25 -> println("Young adult")
in 26..60 -> println("Adult")
else -> println("Not considered an adult")
}
示例 2:使用 when 作为表达式
fun main() {
var weekDay = 3
var day= when(weekDay) {
1->"Monday"
2->"Tuesday"
3->"Wednesday"
4->"Thursday"
5->"Friday"
6->"Saturday"
7->"Sunday"
else-> "Not a week day"
}
print(day)
}
- 优点:
- 增强代码的可读性和可维护性。
- 避免嵌套 if 语句以获得更清晰的逻辑。
5. Null安全和安全转换操作符
- 空安全
- Kotlin 的 null 安全性由编译器强制执行,旨在通过消除代码中存在风险的 null 引用来防止 NullPointerExceptions。
var a: String = "kotlin" // Regular initialization means non-nullable by default
a = null // compilation error
要允许空值,可以通过编写 String? 将变量声明为可为空字符串:
var b: String? = "kotlin" // can be set to null
b = null
print(b)
- 安全调用 Kotlin 安全调用运算符?允许访问字段或调用可为空变量的方法。特别是,仅当变量的引用不为空时,该运算符才对变量执行操作。否则,返回 null。例如:
fun main() {
val a: String? = "kotlin"
// it returns a's length, or null if a in null
println(a?.length)
// it returns a's value in uppercase, or null if a in null
println(a?.uppercase())
}
安全转换
如果对象不是目标类型,则常规强制转换可能会导致 ClassCastException。另一种选择是使用安全强制转换,如果尝试不成功,则返回 null。
val obj: Any = "Kotlin"
val str: String? = obj as? String