Kotlin学习与实践 (十)Kotlin的可空性
可空类型
* 类型就是数据的分类。决定了该类型可能的值,以及在该类型值上可以完成的操作。 * 与Java不同,Kotlin对可空类型的显示的支持。可空类型是Kotlin类型系统中帮助避免NullPointException错误的特性。* 这是一种指出你的程序中那些变量和属性允许为null的方式。 * 可空类型和非可空类型的对象在运行时没有什么区别,可空类型并不是非空类型的包装。所有检查都是在编译时期,所以Kotlin的可空类型并不会在运行时带来额外的开销。先来看看Java中的空指针是怎么造成的
private int stringLen(String s){retrun s.length
}
当传入的参数s为null的时候就会发生空指针异常、。
* 使用Kotlin声明同样的方法不接收可能为null的参数,因为当如果传入可能会null的参数在编译器就会被标记成错误。* 这样就保证了strLen函数永远不会在运行的时候抛出NullPointException
fun strLen(s: String) = s.length //Kotlin默认s是不可为null的参数如果你传入一个可能为null参数,编译的时候就会报错
如果你想要声明一个接收参数可能为null的参数,就需要将这个参数声明为可空类型的参数,而可控类型的参数声明起来也特别简单,只需要咋参数的类型之后加上?
* ?可以加载任意类型的后面来表示这个类型的变量可以存储null引用。如String? Int? MyCustomType?* Type ? = Type or null* 没有问号的类型表示这种类型的变量不能存储为null.这说明说有的常见类型都是默认为非空的,除非显示地把它标记为可空的* 可空类型的变量不能直接调用其方法、不能把它赋值给费空类型的变量、也不能把可空类型的值传递给拥有非空类型的参数的函数。* 再与null 进行比较之后,编译器就会记住,并且在这次比较发生的作用域内把这个值当错非空来对待
fun nullAbleStrLen(s: String?): Int = if (null != s) s.length else 0
安全调用符
* Kotlin提供了一种非常有用的工具:安全调用运算符"?"* 它允许你把一次对null的检查和一次方法调用合并成一个操作。例如:s?.toUpperCase() 等同于 if(s!=null) s.toUpperCase() else null* 如果你试图调用一个非空值的方法,这次方法调用就会被正常执行。但是如果是null 这次调用就不会发生,而整个表达式的值就为null
fun printAllCaps(s: String?) {//这里要注意 因为后面的表达式返回值可能为空,前面的对象类型声明的时候就要声明成可空类型val allCaps: String? = s?.toUpperCase()println(allCaps)
}
* 安全调用不光可以调用方法,也能用来访问属性* Kotlin 支持多个安全调用链接再一起使用
fun managerName(employee: Employee): String? = employee?.name
class Address(val streetAddress: String, val zipCode: Int, val city: String, val country: String)
class Company(val name: String, val address: Address?)
class Person(val name: String, val company: Company?)fun Person.countryName(): String {val country = this.company?.address?.countryreturn if (null != country) country else "Unknown"
}
Elvis 运算符“?:”
* Elvis 运算符“?:”* Kotlin 有方便的运算符来提供null的默认值。它被称作Elvis运算符(或 null合并运算符) -> ?:** Elvis运算符接收两个运算数,如果第一个运算数不为null,运算结果就是第一个运算数,如果第一个运算数为null,运算结果就是第二个运算数
fun foo(s: String?): String {val t: String = s ?: " "return t
}
* Elvis运算符经常和安全调用运算符一起使用,用一个值代替对null对象调用方法时返回的null
fun strLenSafe(s: String?): Int = s?.length ?: 0
* 上面获取countryName的方法就可以使用Elvis进一步简化
fun Person.getCountryName(): String = this.company?.address?.country ?: "Unknown"
* Kotlin中 Elvis和return 、 throw 表达式结合再一起使用会更加好使
fun printShippingLabel(person: Person) {val address = person?.company?.address ?: throw IllegalArgumentException("No address")with(address) {println(streetAddress)println("$zipCode $city $country")}
}
安全转换 "as?"
* 常规的as运算符和Java中的类型转换一样转换对象的类型,如果被转换的值不是你试图转化的类型,就会抛出ClassCastException。Kotlin提供了一种安全的类型转化操作 as?* as?运算符尝试把值转换成指定的类型,如果值不是合适的类型就返回null ,经常会和Elvis “?:” 一起使用。
class Person1(val firstName: String, val lastName: String) {override fun equals(other: Any?): Boolean {//类型检查如果不匹配就返回falseval otherPersion1 = other as?Person1 ?: return false//安全检查之后变量会被只能转换为Person1类型return otherPersion1.firstName == firstName && otherPersion1.lastName == lastName}override fun hashCode(): Int {return firstName.hashCode() * 37 + lastName.hashCode()}
}
非空断言 “!!”
* 非空断言是Kotlin提供的一种简单直率的处理可空类型值的工具。* 它使用双叹号表示,可以把任何值转化为非空类型,如果要转换的值是null,则会抛出NullPointException异常
fun ignoreNulls(s: String?) {val sNotNull: String = s!!println(sNotNull)
}
//注意当使用!!并且它的结果是异常时,异常调用栈的跟踪信息只会表明异常发生在哪一行,不会表明异常时由那个值引起的,所以尽量避免在一行使用多个非空断言// person!!.company!!.address!!.name 出现异常的时候不好查找引起的对象
转载于:https://www.cnblogs.com/mauiie/p/kotlin_null.html
Kotlin学习与实践 (十)Kotlin的可空性相关推荐
- Kotlin 学习笔记(十四)浅读协程
上一篇-Kotlin 学习笔记(十三)高阶函数 为什么需要协程 举例一个异步编程中最常见的场景:后台线程执行一个A任务,下一个B任务依赖于A任务的执行结果,所以必须等待上一个任务执行完成后才能开始 ...
- Kotlin学习与实践 (一)WWH (what?why?how)
什么是Kotlin? 要回答这个问题吗,只需要点击Kotlin官网就能了解到: Kotlin是JVM和Android的实用编程语言,结合了OO和功能特性,专注于互操作性,安全性,清晰度和工具支持. 作 ...
- Kotlin学习与实践 (三)fun 函数
通过例子来学习如何高效的在Kotlin中定义使用函数. 1.命名参数.默认参数.顶层函数.扩展函数 * 展示几种创建集合类的方法和扩展的简单操作集合类的方法 fun createCollection( ...
- Kotlin学习(二十): Kotlin实现流的读取的方案
在Java对流的读取是下面的那样,当前不要忘记流的关闭close. // java 代码 void someFunc(InputStream in, OutputStream out) throws ...
- Kotlin学习笔记——安装配置kotlin
这个系列主要为了整理一下自己学习kotlin的笔记以及学习过程中遇到的问题. 整个系列初期大约有20篇左右,我会尽快整理出来.后续会不定时更新,主要是实际使用的案例或者一些知识点的深入探讨. 1.安装 ...
- Kotlin学习(二)Kotlin基础语法
学习一门语言,我总是会先学习一下基本的语法.因为并不急着应用Kotlin去开发项目,所以,还是有很多的时间去学习.今天,简单的总结一下Kotlin的基本语法. 一.函数 1.有参有返回值函数 fun ...
- Kotlin学习之路(1)——Kotlin的概念
前言 记得学习Kotlin已经是2021年5月的事了,只是在写第二个个人项目时使用过,平时还是对Java语言的使用比较多,对Kotlin很多东西都有以往,并且也想起当时并没有写博客记录,只是在IDEA ...
- Kotlin学习 PART 2:kotlin基础
想了很久,一直在想怎么记录笔记最高效,最后感觉还是结合代码比较好. 1.整数的遍历,in表示是否在一个区间内,!in表示不再某个区间内 fun fizzBuzz(i:Int) = when { i%1 ...
- Kotlin学习 PART 1:kotlin定义和目的
从事android开发转眼间已经两年多了呢,一直用的java开发,早就想试试用kotlin进行开发,稍微瞄一眼 = =,感觉真的,某人说的还真的有点道理,kotlin比起你们用的那些垃圾语言要高级的多 ...
最新文章
- java中单例实现常用的方式_Java单例的常见形式
- ASP.NETmvc常用JQUERY插件【jquery.dataTables.js】
- HTML+CSS+JavaScript复习笔记持更(三)——表单篇
- hibernate-jpa/hibernate-jpa-2.1-api-1.0.0.final.jar源代码下载地址
- 你最想要的圣诞礼物是什么?
- MPLS ×××实验之OSPF sham-link
- php对表格的处理,JavaScript_js处理表格对table进行修饰,js处理表格 1、行颜色间隔显示 - phpStudy...
- 移动开发(C#、VB.NET)Smobiler开发平台——GifView控件的使用方式
- 让WKWebView支持NSURLProtocol
- vb中调用aspx页面
- Unity3D 学习教程 14 C# 旋转镜头
- sdi 采集卡---环视频拼接直播方案
- 如何在计算机自动开机时选择用户,电脑如何设置自动开机,详细教您如何设置...
- MATLAB疲劳检测系统
- 桂林理工大学 大学语文题库2021年春季学期
- 【金融系列】使用Python分析债券,画零息利率曲线,对债券进行精确定价,计算债券的麦考利久期、修正久期和凸度,并进行价格敏感性分析
- P2168 [NOI2015]荷马史诗
- (SEED-Lab)Buffer Overflow Vulnerability Lab缓冲区溢出实验
- 阿里云oss图片的常用处理方法小结
- mysql中select是什么意思_MYSQL中select的是详解
热门文章
- seaborn系列 (13) | 点图pointplot()
- 计算机运行游戏慢怎么办,电脑运行太慢了太卡了怎么办,台式电脑运行速度慢的解决方法...
- 数据结构 排序 java_Java数据结构之排序---希尔排序
- 图形学大牛归国投身产业,还是个让女孩们败家的赛道
- 在Hinton看来是“宇宙答案”GPT-3,到LeCun这里却“对世界一无所知”
- 高通加大5G应用力度:发布又一款手机芯片,还推出机器人和无人机5G系统
- 传奇芯片设计大神Jim Keller又离职了,英特尔失了总设计师,网友喊话雷军:挖他!...
- 中国首份AI落地白皮书发布!地方政府规模大,金融领域最积极,北京供给超上海深圳总和...
- ccf题库中2015年12月2号消除类游戏
- Tiny4412开发板 LED灯的控制