纵有疾风起
人生不言弃

Kotlin那些实用的语法糖:空安全、类型转换 & 相等性判断

Kotlin那些实用的语法糖:空安全、类型转换 & 相等性判断插图

前言

Kotlin被Google官方认为是Android开发的一级编程语言。今天,我将主要讲解,关于Kotlin的一些实用语法糖,主要包括:

  • 范围使用:in、downTo、step、until
  • 类型检查 & 转换:is、智能转换、as
  • 相等性:equals()、==、===
  • 空安全
Kotlin那些实用的语法糖:空安全、类型转换 & 相等性判断插图1
示意图

1. 范围使用

主要用于表示范围,主要包括:in、downTo、step、until

/** *  1. in *  作用:在...范围内 **/// 表示:若i在1-5范围内,则执行下面代码// 注:闭区间,[1,5]if (i in 1..5) {    println("i 在 1-5 内")}// 表示:若i不在1-5范围内,则执行下面代码// !in表示不在...范围内if (i !in 1..5) {    println("i 不在 1-5 内")}/** *  2. until *  作用:表示开区间 **/// 输出1234for (i in 1 until 5) { println(i)}/** *  3. downTo *  作用:倒序判断 **/ for (i in 5 downTo 1) {    println(i) }/** *  4. step *  作用:调整步长 **/// 设置步长为2,顺序输出1、3、5for (i in 1..5 step 2) println(i) // 设置步长为2,倒序输出5、3、1for (i in 1 downTo 5 step 2) println(i) 

2. 类型检查 & 转换

包括:is、智能转换 和 as

/** *  1. is *  作用:判断一个对象与指定的类型是否一致 **/// 判断变量a的数据类型是否是Stringvar a: Any = "a"if (a is String) {    println("a是String类型")}if (a !is Int) {    println("a不是Int类型")}/** *  2. 智能转换 *  说明: kotlin不必使用显式类型转换操作,因为编译器会跟踪不可变值的is检查以及显式转换,并在需要时自动插入(安全的)转换 **/ var a: Any = "a"if (a is String) {    println("a是String类型")    println(a.length) // a 自动转换为String类型    //输出结果为:1}// 反向检查: a自动转换为String类型if (a !is String) {    print(a.length)}// 在 && 和 || 的右侧也可以智能转换:// `&&` 右侧的 a 自动转换为Stringif (a is String && a.length > 0)// `||` 右侧的 a 自动转换为Stringif (a is String || a.length > 0)// 在when表达式和while循环里也能智能转换:when(a){    is String -> a.length    is Int -> a + 1}// 需要注意:当编译器不能保证变量在检查和使用之间不可改变时,智能转换不能用。智能转换能否适用根据以下规则:// 1. val 局部变量——总是可以,局部委托属性除外;// 2. val 属性——如果属性是 private 或 internal,或者该检查在声明属性的同一模块中执行。智能转换不适用于 open 的属性或者具有自定义 getter 的属性;// 3. var 局部变量——如果变量在检查和使用之间没有修改、没有在会修改它的 lambda 中捕获、并且不是局部委托属性;// 4. var 属性——决不可能(因为该变量可以随时被其他代码修改)/** *  3. 强制类型转换:as **/var any: Any = "abc"var str: String = any as String// 强制类型转换是不安全的,若类型不兼容则会抛出一个异常var int: Int = 123var str: String = int as String// 抛出ClassCastException/** *  4. 可空转换操作符:as? *  作用:null不能转换为String,因该类型不是可空的,此时使用可空转换操作符as? **/var str = nullvar str2 = str as String// 抛出TypeCastException// 使用安全转换操作符as?可以在转换失败时返回null,避免了抛出异常。var str = nullvar str2 = str as? Stringprintln(str2) //输出结果为:null

3. 相等性判断

在Kotlin中,存在结构相等 & 引用相等 两种相等判断。

/** *  1. 结构相等:equals()或 == *  作用:判断两个结构是否相等 **/var a = "1"var b = "1"if (a.equals(b)) {    println("a 和 b 结构相等")    // 输出结果为:a 和 b 结构相等}var a = 1var b = 1if (a == b) {    println("a 和 b 结构相等")    // 输出结果为:a 和 b 结构相等}/** *  2. 引用相等:=== *  作用:判断两个引用是否指向同一对象 */ // 设置一个类如下data class User(var name: String, var age: Int)// 设置值var a = User("Czh", 22)var b = User("Czh", 22)var c = bvar d = a// 对比两个对象的结构if (c == d) {    println("a 和 b 结构相等")} else {    println("a 和 b 结构不相等")}// 对比两个对象的的引用if (c === d) {    println("a 和 b 引用相等")} else {    println("a 和 b 引用不相等")}// 输出结果:a 和 b 结构相等a 和 b 引用不相等

4. 空安全

  • 在Java中,NullPointerException异常十分常见
  • 而Kotlin的优点则是可以尽可能避免执行代码时出现的空指针异常
/** *  1. 可空类型与非空类型 *  在Kotlin中,有两种情况最可能导致出现NullPointerException **/// 情况1:显式调用 throw NullPointerException()// 情况2:使用!! 操作符// 说明:!!操作符将任何值转换为非空类型,若该值为空则抛出异常var a = nulla!!// 抛出KotlinNullPointerException// 情况3:数据类型不能为null// 在 Kotlin 中,类型系统区分一个引用可以容纳 null (可空引用) 和 不能容纳(非空引用)// 如:String类型变量不能容纳null// 若要允许为空,可声明一个变量为可空字符串:在字符串类型后面加一个问号?对于String,则是写作:String?var b: String? = "b"b = null/** *  2. 安全调用操作符 *  作用:表示如果若不为null才继续调用 **/ b?.length // 表示:若b不为null,才调用b.length // 注:安全调用符还可以链式调用 a?.b?.c?.d // 假设a不为null,才继续往下调用,以此类推 // 若该链式调用中任何一个属性为null,整个表达式都会返回null。 // 若只对非空值执行某个操作,可与let一起使用a?.b?.let { println(it) }

至此,关于Kotlin的入门语法讲解完毕。


5. 总结

  • 本文介绍了Kotlin的一些实用语法糖
  • 接下来推出的文章,我将继续讲解Kotlin的相关知识,包括使用、语法特点等,感兴趣的读者可以继续关注我的博客哦:Carson_Ho的Android博客

请点赞!因为你们的赞同/鼓励是我写作的最大动力!

相关文章阅读
Android开发:最全面、最易懂的Android屏幕适配解决方案
Android开发:史上最全的Android消息推送解决方案
Android开发:最全面、最易懂的Webview详解
Android开发:JSON简介及最全面解析方法!
Android四大组件:Service服务史上最全面解析
Android四大组件:BroadcastReceiver史上最全面解析


欢迎关注Carson_Ho的简书!

不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度

Kotlin那些实用的语法糖:空安全、类型转换 & 相等性判断插图2

文章转载于:https://www.jianshu.com/p/37133461ae6b

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » Kotlin那些实用的语法糖:空安全、类型转换 & 相等性判断
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录