Kotlin实用语法糖空安全类型转换及相等性判断

 更新时间:2022年06月23日 15:19:06   作者:Carson.Ho  
这篇文章主要为大家介绍了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的入门语法讲解完毕,更多关于Kotlin空安全类型转换相等性判断的资料请关注得牛网其它相关文章!

相关文章

  • Android中监听Home键的4种方法总结

    Android中监听Home键的4种方法总结

    这篇文章主要介绍了Android中监听Home键的4种方法总结,本文讲解了onSaveInstanceState方法、onUserLeaveHint方法、ACTION_CLOSE_SYSTEM_DIALOGS、framework PhoneWindowManager.java等4种方法,需要的朋友可以参考下
    2015-04-04
  • Android应用自动跳转到应用市场详情页面的方法

    Android应用自动跳转到应用市场详情页面的方法

    最近在工作中遇到一个需求,推广部门要求实现应用自动跳转到应用市场详情页面,通过查找一些资料,实现出来了,觉得有必要整理下方便以后或者有需要的朋友们参考借鉴,下面来一起详细看看Android应用自动跳转到应用市场详情页面的方法吧。
    2016-12-12
  • Android中使用的定时针(刷新页面请求服务器)详解

    Android中使用的定时针(刷新页面请求服务器)详解

    这篇文章主要介绍了Android中使用的定时针(刷新页面请求服务器)详解的相关资料,需要的朋友可以参考下
    2016-12-12
  • Android学习笔记45之gson解析json

    Android学习笔记45之gson解析json

    JSON即JavaScript Object Natation,是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web开发提供了一种理想的数据交换格式。通过本篇文章给大家介绍Android学习笔记45之gson解析json的相关内容,对android gson解析json相关知识感兴趣的朋友一起学习吧
    2015-12-12
  • Android UI实现单行文本水平触摸滑动效果

    Android UI实现单行文本水平触摸滑动效果

    这篇文章主要为大家详细介绍了Android UI实现单行文本水平触摸滑动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 解决EditText不显示光标的三种方法(总结)

    解决EditText不显示光标的三种方法(总结)

    下面小编就为大家带来一篇解决EditText不显示光标的三种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 解决Android中自定义DialogFragment解决宽度和高度问题

    解决Android中自定义DialogFragment解决宽度和高度问题

    Android中自定义DialogFragment解决宽度和高度问题但是我们很多时候想把DialogFragment的高度固定,那么我们需要设置DialogFragment的高度,在Fragment的onResume()声明周期方法中设置window的宽高即可
    2017-12-12
  • Android WebView线性进度条实例详解

    Android WebView线性进度条实例详解

    这篇文章主要介绍了Android WebView线性进度条实例详解的相关资料,需要的朋友可以参考下
    2016-01-01
  • Android启动页广告(腾讯广告联盟)解决方法及源码下载

    Android启动页广告(腾讯广告联盟)解决方法及源码下载

    这篇文章主要介绍了Android启动页广告(腾讯广告联盟)解决方法的相关资料,启动页几乎成为了每个app的标配,有些商家在启动页中增加了开屏广告以此带来更多的收入,需要的朋友可以参考下
    2017-03-03
  • Android下2d物理引擎Box2d用法简单实例

    Android下2d物理引擎Box2d用法简单实例

    这篇文章主要介绍了Android下2d物理引擎Box2d用法,实例分析了在Android平台上使用Box2d的基本技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论