引入可空性,将运行时错误转化编译时错误。java
该操做符组合空处理和方法调用。若是是null跳过该方法调用,返回null值。安全
若是第一个值不为空返回该值,不然返回第二个值ide
若是不匹配就返回null函数
foo!!
,若是foo为空就抛出NPEthis
let函数使咱们更加处理传递给函数的空参数,确保它是非空参数。spa
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函数就能轻松的处理。code
email?.let { email -> sendEmailTo(email) } //更加简单的写法 email?.let { sendEmailTo(it) }
若是email不为空才传递到要求非空参数的函数。ci
kotlin的类须要初始化全部的属性,若是咱们不能提供初始化值,将其设置为可空值,初始化为null时,每次改属性都须要使用?.或!!操做符。hash
为了解决这一问题,kotlin提供了lateinit关键词来延迟初始化属性,若是咱们访问该属性却没有初始化时会报异常 "lateinit property myService has not been initialized"it
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>
多数状况下,变量、属性、参数、和返回类型,kotlin的Int类型编译成java的int原始类型。
原始类型Int做为泛型函数参数时会编译成对应的java包裹类型。
例如:Int做为集合类型参数,集合将会保存java.lang.Integer类型,对应的包裹类型。
Kotlin的Unit类型在函数中的使用等于java的void。表示没有返回值。
主要区别是Unit能够做为类型参数。Unit类型只有一个值存在,也成为Unit在函数中隐式返回。在重载一个函数返回泛型参数时能够使函数返回Unit类型。
interface Processor<T> { fun process(): T } class NoResultProcessor : Processor<Unit> { override fun process() { //不须要明确返回Unit类型 // do stuff } }
fun fail(message: String): Nothing { throw IllegalStateException(message) }
注意:函数返回Nothing能够做为Elvis操做符右边处理条件确认:
val address = company.address ?: fail("No address") println(address.city)