Kotlin可空性

我们上周学习了kotlin创建集合,接下来我们学习Kotlin的可空类型。

可空类型

问号可以加在任何类型的后面来表示这个类型的变量可以存储null引用

没有问号的类型表示这种类型的变量不能存储null引用,这说明所有常见类型默认都是非空的,除非显式的把它标记为空

安全调用运算符:“?.”

它允许把一次null检查和一次方法调用合并成一个操作

安全调用运算符只会调用非空值的方法

Elvis运算符:“?:”

Elvis运算符接收两个运算数,如果第一个运算数不为null,运算结果就是第一个运算数;如果第一个运算数为null,运算结果就是第二个运算数

安全转换:“as?”

as?运算符尝试把值转换成指定的类型,如果值不是合适的类型就返回null

安全调用、安全转换和Elvis运算符都非常有用,它们出现在Kotlin代码中的频率很高。但有时你病不需要Kotlin的这些支持来处理null值,你只需要直接告诉编译器这个值实际上并不是null,所以我们就来继续看看如何做到这点

非空断言:“!!”

非空断言是Kotlin提供给你的最简单直率的处理可空类型值的工具。它使用双感叹号表示,可以把任何值转换成非空类型。如果对null值做非空断言,则会抛出异常

“let”函数

let函数就是把一个调用它的对象变成lambda表达式的参数。如果结合安全调用语法,他能有效的把调用let函数的可空对象转变成非空类型

安全调用“let”只在表达式不为null时执行lambda

注意,如果有一些很长的表达式结果不为null,而你又要使用这些结果时,let表示法特别方便。这种情况下你不必创建一个单独的变量。

还有一种情况是,属性最终是非空的,但不能使用非空值在构造方法中初始化。接下来我们看看Kotlin如何处理这种情况

延迟初始化的属性

延迟初始化的属性都是var,因为需要在构造方法外修改它的值。尽管这个属性是非空类型,但是你不需要在构造方法中初始化它

可空类型的扩展

用可空接收者调用扩展函数

类型参数的可空性

Kotlin中所有泛型类和泛型函数的类型默认都是可空的。任何类型,包括可空类型在内。都可以替换类型参数

上面代码中“T”被推导的类型时可空类型“Any?”,因此,尽管没有用问号结尾,实参t依然允许持有null

可空性和Java

在实现Java类或者接口的方法时一定要搞清楚它的可空性。因为方法的实现可以在非Kotlin的代码中被调用,Kotlin编译器会为你声明的每一个非空的参数生成非空断言。如果Java代码传给这个方法一个null值,断言将会触发,你会得到一个异常,即便你从没有在你的实现中访问过这个参数的值。

基本数据类型和其他基本类型

Kotlin并不区分基本数据类型和它们的包装类

基本数据类型:Int、Boolean及其他

在Java中,不能对基本数据类型的值调用方法或者把他们存放在集合中,在需要对象的时候对基本数据进行封装。因此,你不能用Collection来定义一个整数的集合,而必须用Collection来定义

Kotlin并不区分基本类型和包装类型,你使用的永远是同一个类型(比如:Int)

可空的基本数据类型:Int?、Boolean?及其他

必须检查两个值都不为null,然后编译器才允许你正常的比较它们

数字转换

每一种基本数据类型(Boolean除外)都定义有转换函数:toByte()、toShort()、toChar()。这些函数都支持双向转换:既可以把小范围的类型括展到大范围,比如Int.toLong(),也可以把大范围的类型截取到小范围,比如Long.toInt()

Kotlin要求转换必须是显式的

字符串转换

kotlin标准库提供了一套相似的扩展方法,用来把字符串转换成基本数据类型(toInt、toByte、toBoolean等)

“Any”和“Any?”:根类型

在kotlin中,Any是所有类型的超类型(所有类型的根),包括像Int这样的基本数据类型

在java中,Object只是所有引用类型的超类(引用类型的根),而基本数据类型并不是类层级结构的一部分

注意Any是非空类型,所以Any类型的变量不可以持有null值。在Kotlin中如果需要可以持有任何可能值的变量,包括null在内,必须使用Any?类型

当Kotlin函数使用Any时,它会被编译成Java字节码中的Object

Unit类型:Kotlin的“void”

Kotlin中的Unit类型完成了Java中的void一样的功能。

Unit是一个完备的类型,可以作为类型参数,而void却不行。

当重写返回泛型参数的函数时,只需要让方法返回Unit类型的值

Nothing类型:“这个函数永不返回”

在kotlin中throw是表达式,所以你可以使用塔作为Elvis表达式的一部分

throw表达式的类型是特殊类型Nothing。该类型没有值,而是用于标记永远不能达到的代码位置

集合与数组

kotlin以java集合库为基础构建,并通过扩展函数增加的特性来增强它

可空性和集合

kotlin完全支持类型参数的可空性

对包含可空值的集合使用filterNotNull

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180702G05VQL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励