Nullability
引入可空性,将运行时错误转化编译时错误。
Nullable types(可空类型)
安全调用操作符: ?.
该操作符组合空处理和方法调用。如果是null跳过该方法调用,返回null值。
elvis操作符: ?:
如果第一个值不为空返回该值,否则返回第二个值
安全造型: as?
如果不匹配就返回null
非空断言: !!
foo!!
,如果foo为空就抛出NPE
let函数
let函数使我们更加处理传递给函数的空参数,确保它是非空参数。
fun sendEmailTo(email: String) {
println("Sending email to $email")
}
>>> val email: String? = ...
>>> sendEmailTo(email)
ERROR: Type mismatch: inferred type is String? but String was expected
如果传递一个空参数会错误,如果我们使用let函数就能轻松的处理。
email?.let { email -> sendEmailTo(email) }
//更加简单的写法
email?.let { sendEmailTo(it) }
如果email不为空才传递到要求非空参数的函数。
late-initialized属性
kotlin的类需要初始化所有的属性,如果我们不能提供初始化值,将其设置为可空值,初始化为null时,每次改属性都需要使用?.或!!操作符。
为了解决这一问题,kotlin提供了lateinit关键词来延迟初始化属性,如果我们访问该属性却没有初始化时会报异常 "lateinit property myService has not been initialized"
空类型的扩展
kotlin中的this可以为null值,所以有许多空类型的扩展函数使用它处理null的情况。
例如kotlin中String?的扩展方法:
/**
* Returns `true` if this nullable char sequence is either `null` or empty or consists solely of whitespace characters.
*/
@kotlin.internal.InlineOnly
public inline fun CharSequence?.isNullOrBlank(): Boolean = this == null || this.isBlank()
可空的类型参数
默认,所有的类和函数参数的都是可空。一个类型参数可以取代任意类型,包括空类型,这种情况,声明使用类型参数作为可空类型,例如我们生存参数类型T没有在后面标记问好。
fun <T> printHashCode(t: T)
{ println(t?.hashCode())
}
>>> printHashCode(null)
null
上面T代表Any?,所以它的值可以为Null,明确使T为非空时,必须要使用<T: Any>
原始和其他基础类型
原始类型:Int,Boolean...
多数情况下,变量、属性、参数、和返回类型,kotlin的Int类型编译成java的int原始类型。
原始类型Int作为泛型函数参数时会编译成对应的java包裹类型。
例如:Int作为集合类型参数,集合将会保存java.lang.Integer类型,对应的包裹类型。
可空原始类型: Int?、Boolean?、
Any和Any?: 根类型
Unit类型: kotlin的void类型
Kotlin的Unit类型在函数中的使用等于java的void。表示没有返回值。
主要区别是Unit可以作为类型参数。Unit类型只有一个值存在,也成为Unit在函数中隐式返回。在重载一个函数返回泛型参数时可以使函数返回Unit类型。
interface Processor<T>
{ fun process(): T
}
class NoResultProcessor : Processor<Unit>
{ override fun process() { //不需要明确返回Unit类型
// do stuff
}
}
Nothing :函数没有返回值
fun fail(message: String): Nothing
{ throw
IllegalStateException(message)
}
注意:函数返回Nothing可以作为Elvis操作符右边处理条件确认:
val address = company.address ?: fail("No address")
println(address.city)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。