kotlin是谷歌推出的Android开发的又一支持语言,没办法,程序猿就是不停的学习。过了一遍基础以后,记录一些kotlin的一些特点。
在 Kotlin 中,类型分为可空引用和非空引用。
例如,String 类型的常规变量不能容纳 null :
var a: String = "abc"
a = null // 如果这样写,就会提示错误,要是在java中运行时才会错误
当然可以声明变量为可空变量,用 String?
var a: String? = "abc"
a = null //此时就不会提示错误了
现在,如果你调用 a 的方法或者访问它的属性:val l = a.length
安全调用操作符 ?.
a?.length
如果 a 非空,返回 a.length ,否则返回 null ,这个表达式的类型是Int?
。
如果要只对非空值执行某个操作,安全调用操作符可以与 let
一起使用:
val listWithNulls: List = listOf("A", null)
for (item in listWithNulls) {
item?.let { println(it) } // 输出 A 并忽略 null
}
Elvis 操作符 ?:
val l = b?.length ?: -1
如果?:
左侧表达式非空,elvis 操作符就返回其左侧表达式,否则返回右侧表达式。 请注意,当且仅当左侧为空时,才会对右侧表达式求值。
请注意,因为 throw 和 return 在 Kotlin 中都是表达式,所以它们也可以用在 elvis 操作符右侧。这可能会非常方便,例如,检查函数参数:
fun foo(node: Node): String? {
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException("name expected")
// ……
}
val l = b!!.length
如果 b 为空,就会抛出一个空指针异常.
如果对象不是目标类型,那么常规类型转换可能会导致 ClassCastException 。 另一个选择是使用安全的类型转换,如果尝试转换不成功则返回null
val aInt: Int? = a as? Int
如果你有一个可空类型元素的集合,并且想要过滤非空元素,你可以使用 filterNotNull 来实现。
val nullableList: List = listOf(1, 2, null, 4)
val intList: List = nullableList.filterNotNull()
for (item in intList) println(item)
针对空安全可以参考:
// 这里不能通过编译. User对象不能是null
var notNullUser: User= null
// User可以是 null
var user: User? = null
// 无法编译, user可能是null,我们需要进行处理
user.print()
// 只要在user != null时才会打印
user?.print()
// 使用Elvis操作符来给定一个在是null的情况下的替代值
val name = user?.name ?: "empty"
/**
如果user为可空类型,又一定要调用它的成员函数和变量,可以用!!操作符
两种可能,要么正确返回name,要么抛出空指针异常
当user为null,你不想返回null,而是抛出一个空指针异常,你就可以使用它。
*/
var name = user!!.name
定义一个变量之后,分三种情况:
kotlin.UninitializedPropertyAccessException: lateinit property mPresenter has not been initialized
?.
和!!.
来执行不过涉及到延迟初始化又是另外一篇文章了。