Kotlin一大特色之空安全
前言
kotlin是谷歌推出的Android开发的又一支持语言,没办法,程序猿就是不停的学习。过了一遍基础以后,记录一些kotlin的一些特点。
可空类型与非空类型
在 Kotlin 中,类型分为可空引用和非空引用。
例如,String 类型的常规变量不能容纳 null :
var a: String = "abc"
a = null // 如果这样写,就会提示错误,要是在java中运行时才会错误
当然可以声明变量为可空变量,用 String?
var a: String? = "abc"
a = null //此时就不会提示错误了
现在,如果你调用 a 的方法或者访问它的属性:val l = a.length
安全的调用
安全调用操作符 ?.
a?.length
如果 a 非空,返回 a.length ,否则返回 null ,这个表达式的类型是Int?
。
如果要只对非空值执行某个操作,安全调用操作符可以与 let
一起使用:
val listWithNulls: List<String?> = listOf("A", null)for (item in listWithNulls) {item?.let { println(it) } // 输出 A 并忽略 null}
Elvis 操作符
Elvis 操作符 ?:
val l = b?.length ?: -1
如果?:
左侧表达式非空,elvis 操作符就返回其左侧表达式,否则返回右侧表达式。 请注意,当且仅当左侧为空时,才会对右侧表达式求值。
请注意,因为 throw 和 return 在 Kotlin 中都是表达式,所以它们也可以用在 elvis 操作符右侧。这可能会非常方便,例如,检查函数参数:
fun foo(node: Node): String? {val parent = node.getParent() ?: return nullval name = node.getName() ?: throw IllegalArgumentException("name expected")
// ……}
!! 操作符
val l = b!!.length
如果 b 为空,就会抛出一个空指针异常.
安全的类型转换
如果对象不是目标类型,那么常规类型转换可能会导致 ClassCastException 。 另一个选择是使用安全的类型转换,如果尝试转换不成功则返回null
val aInt: Int? = a as? Int
可空类型的集合
如果你有一个可空类型元素的集合,并且想要过滤非空元素,你可以使用 filterNotNull 来实现。
val nullableList: List<Int?> = listOf(1, 2, null, 4)val intList: List<Int> = nullableList.filterNotNull()for (item in intList) println(item)
针对空安全可以参考:
// 这里不能通过编译. User对象不能是null
var notNullUser: User= null// User可以是 null
var user: User? = null// 无法编译, user可能是null,我们需要进行处理
user.print()// 只要在user != null时才会打印
user?.print()// 使用Elvis操作符来给定一个在是null的情况下的替代值
val name = user?.name ?: "empty"/**
如果user为可空类型,又一定要调用它的成员函数和变量,可以用!!操作符
两种可能,要么正确返回name,要么抛出空指针异常
当user为null,你不想返回null,而是抛出一个空指针异常,你就可以使用它。
*/
var name = user!!.name
总结
定义一个变量之后,分三种情况:
- 第一:延迟加载,在某个一定能执行的地方进行初始化,否则编译不通过提示:
kotlin.UninitializedPropertyAccessException: lateinit property mPresenter has not been initialized
- 第二种就是创建变量的时候初始化这样防止了出现 空指针,而且编译也会通过不会出现未初始化情况
- 第三种就是开始的时候没法初始化只能为null,后期通过判断null来创建对象,通过
?.
和!!.
来执行
不过涉及到延迟初始化又是另外一篇文章了。
Kotlin一大特色之空安全相关推荐
- 这个横行霸道的美食,也是中秋节的一大特色,我用Python爬取京东1546条大闸蟹商品数据带大家看看
大家好,我是才哥. 中秋节除了月饼之外,还有一道美食也开始闯入人们的餐桌,这边是横行"霸道"的大闸蟹! 那么,大闸蟹又有哪些特点,都有哪些大闸蟹品牌值得关注呢? 今天,就跟随着本文 ...
- 【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)
文章目录 I . Kotlin 变量总结 II . Kotlin 非空变量 III . 非空变量不能赋空 IV . lateinit 关键字 V . lateinit 初始化判定 VI . Kotli ...
- Kotlin 特色之 Sealed Class 和 Interface
/ 今日科技快讯 / 近日,我国在太原卫星发射中心使用长征六号改运载火箭,成功将云海三号卫星发射升空,卫星顺利进入预定轨道,发射任务获得圆满成功.该卫星主要用于开展大气海洋环境要素探测.空间环 ...
- 《Kotlin项目实战开发》 第3章 类型系统与可空类型
2019独角兽企业重金招聘Python工程师标准>>> 第3章 类型系统与可空类型 跟Java.C和C ++ 一样, Kotlin也是"静态类型编程语言". 通常 ...
- 在 Java 中如何优雅地判空
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 李良逸 来源 | blog.imuxuan.c ...
- 如何判断map为空_在Java中如何优雅地判空
来自:李良逸 链接:http://blog.imuxuan.com/archives/86 判空灾难 作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢 NullPo ...
- 如何判断map为空_Java到底如何更优雅地判空
Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:李良逸 来源:http://blog.imuxuan.com/ 判空灾难 作为搬砖党的一族们,我们对判空一定再熟悉不过了 ...
- Kotlin Contract
Kotlin 的智能推断是其语言的一大特色. 智能推断,能够根据类型检测自动转换类型. 但是,智能推断并没有想象中的强大,例如下面的代码就无法进行推断,导致编译失败: fun String?.isNo ...
- Kotlin教程(二)函数
写在开头:本人打算开始写一个Kotlin系列的教程,一是使自己记忆和理解的更加深刻,二是可以分享给同样想学习Kotlin的同学.系列文章的知识点会以<Kotlin实战>这本书中顺序编写,在 ...
最新文章
- 【编译原理】关于克林闭包与正闭包的讨论
- 成功解决python\ops\seq2seq.py TypeError: ms_error() got an unexpected keyword argument 'logits'
- GCD牛逼的中枢调度器
- spring学习笔记05-IOC常用注解(二)
- 深入理解Mysql - 内部架构与模块
- L2-022 重排链表-PAT团体程序设计天梯赛GPLT
- ColorTransform类应用实例:鼠标经过时使图片发光。
- 北方交大的开源软件镜像站
- iptables基础(01)
- Java逐帧动画播放器V0.1.0
- 图片文字怎么合并转发_怎么把图片和文字组合发微信
- C语言数组制作拼图游戏,C语言例子自制拼图游戏
- asa清空配置_思科ASA基本配置
- PHPstudy mysql secure_file_priv 设置
- 无心剑中译狄兰·托马斯《不要温顺地走进那个良夜》
- 94---Python 极坐标系下绘制双曲螺旋线
- loadrunner的吞吐量和吞吐率
- Node.js实战13:fs模块奥义!开发一个数据库。
- TeamViewer未知原因错误
- putty 串口调试设置
热门文章
- Angular 运行报错 RouterModule.forRoot() called twice.
- Python知识点4——if分支与while循环
- tensorflow 无法执行sess =tf .session ()_深度学习|费解的tensorflow
- 面试小结之Elasticsearch篇
- +7白盒测试与黑盒测试的定义与区别
- 荣耀9将要回归金属材质,网友直呼:看着就很贵
- github远程提交简单入门
- 一步步部署SharePoint Workflow 2013
- WordPress 2.9.2 使用感受
- Valgrind 快速入门