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


前言

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

  • 范围使用:in、downTo、step、until
  • 类型检查 & 转换:is、智能转换、as
  • 相等性:equals()、==、===
  • 空安全
示意图

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
 *  作用:表示开区间
 **/
// 输出1234
for (i in 1 until 5) {
 println(i)
}

/**
 *  3. downTo
 *  作用:倒序判断
 **/
 for (i in 5 downTo 1) {
    println(i)
 }

/**
 *  4. step
 *  作用:调整步长
 **/
// 设置步长为2,顺序输出1、3、5
for (i in 1..5 step 2) println(i) 

// 设置步长为2,倒序输出5、3、1
for (i in 1 downTo 5 step 2) println(i) 

2. 类型检查 & 转换

包括:is、智能转换 和 as

/**
 *  1. is
 *  作用:判断一个对象与指定的类型是否一致
 **/
// 判断变量a的数据类型是否是String
var 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 自动转换为String
if (a is String && a.length > 0)
// `||` 右侧的 a 自动转换为String
if (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 = 123
var str: String = int as String
// 抛出ClassCastException

/**
 *  4. 可空转换操作符:as?
 *  作用:null不能转换为String,因该类型不是可空的,此时使用可空转换操作符as?
 **/
var str = null
var str2 = str as String
// 抛出TypeCastException

// 使用安全转换操作符as?可以在转换失败时返回null,避免了抛出异常。
var str = null
var str2 = str as? String
println(str2) //输出结果为:null

3. 相等性判断

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

/**
 *  1. 结构相等:equals()或 ==
 *  作用:判断两个结构是否相等
 **/
var a = "1"
var b = "1"
if (a.equals(b)) {
    println("a 和 b 结构相等")
    // 输出结果为:a 和 b 结构相等
}

var a = 1
var b = 1
if (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 = b
var 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 = null
a!!
// 抛出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的简书!

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容