前言

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一大特色之空安全相关推荐

  1. 这个横行霸道的美食,也是中秋节的一大特色,我用Python爬取京东1546条大闸蟹商品数据带大家看看

    大家好,我是才哥. 中秋节除了月饼之外,还有一道美食也开始闯入人们的餐桌,这边是横行"霸道"的大闸蟹! 那么,大闸蟹又有哪些特点,都有哪些大闸蟹品牌值得关注呢? 今天,就跟随着本文 ...

  2. 【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)

    文章目录 I . Kotlin 变量总结 II . Kotlin 非空变量 III . 非空变量不能赋空 IV . lateinit 关键字 V . lateinit 初始化判定 VI . Kotli ...

  3. Kotlin 特色之 Sealed Class 和 Interface

    /   今日科技快讯   / 近日,我国在太原卫星发射中心使用长征六号改运载火箭,成功将云海三号卫星发射升空,卫星顺利进入预定轨道,发射任务获得圆满成功.该卫星主要用于开展大气海洋环境要素探测.空间环 ...

  4. 《Kotlin项目实战开发》 第3章 类型系统与可空类型

    2019独角兽企业重金招聘Python工程师标准>>> 第3章 类型系统与可空类型 跟Java.C和C ++ 一样, Kotlin也是"静态类型编程语言". 通常 ...

  5. 在 Java 中如何优雅地判空

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 李良逸 来源 | blog.imuxuan.c ...

  6. 如何判断map为空_在Java中如何优雅地判空

    来自:李良逸 链接:http://blog.imuxuan.com/archives/86 判空灾难 作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢 NullPo ...

  7. 如何判断map为空_Java到底如何更优雅地判空

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:李良逸 来源:http://blog.imuxuan.com/ 判空灾难 作为搬砖党的一族们,我们对判空一定再熟悉不过了 ...

  8. Kotlin Contract

    Kotlin 的智能推断是其语言的一大特色. 智能推断,能够根据类型检测自动转换类型. 但是,智能推断并没有想象中的强大,例如下面的代码就无法进行推断,导致编译失败: fun String?.isNo ...

  9. Kotlin教程(二)函数

    写在开头:本人打算开始写一个Kotlin系列的教程,一是使自己记忆和理解的更加深刻,二是可以分享给同样想学习Kotlin的同学.系列文章的知识点会以<Kotlin实战>这本书中顺序编写,在 ...

最新文章

  1. 【编译原理】关于克林闭包与正闭包的讨论
  2. 成功解决python\ops\seq2seq.py TypeError: ms_error() got an unexpected keyword argument 'logits'
  3. GCD牛逼的中枢调度器
  4. spring学习笔记05-IOC常用注解(二)
  5. 深入理解Mysql - 内部架构与模块
  6. L2-022 重排链表-PAT团体程序设计天梯赛GPLT
  7. ColorTransform类应用实例:鼠标经过时使图片发光。
  8. 北方交大的开源软件镜像站
  9. iptables基础(01)
  10. Java逐帧动画播放器V0.1.0
  11. 图片文字怎么合并转发_怎么把图片和文字组合发微信
  12. C语言数组制作拼图游戏,C语言例子自制拼图游戏
  13. asa清空配置_思科ASA基本配置
  14. PHPstudy mysql secure_file_priv 设置
  15. 无心剑中译狄兰·托马斯《不要温顺地走进那个良夜》
  16. 94---Python 极坐标系下绘制双曲螺旋线
  17. loadrunner的吞吐量和吞吐率
  18. Node.js实战13:fs模块奥义!开发一个数据库。
  19. TeamViewer未知原因错误
  20. putty 串口调试设置

热门文章

  1. Angular 运行报错 RouterModule.forRoot() called twice.
  2. Python知识点4——if分支与while循环
  3. tensorflow 无法执行sess =tf .session ()_深度学习|费解的tensorflow
  4. 面试小结之Elasticsearch篇
  5. +7白盒测试与黑盒测试的定义与区别
  6. 荣耀9将要回归金属材质,网友直呼:看着就很贵
  7. github远程提交简单入门
  8. 一步步部署SharePoint Workflow 2013
  9. WordPress 2.9.2 使用感受
  10. Valgrind 快速入门