1

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)

Star_
34 声望2 粉丝

Strive to be happy!


« 上一篇
Kotlin lambdas