方法定义
强类型的语言所以参数和返回值必须定义类型
fun sum(a: Int, b: Int): Int {
return a + b
}
像上例中,如果函数体只有一个表达式,而且能推断出返回类型时,可以写成这样:
fun sum(a: Int, b: Int) = a + b
如果无返回类型,那么返回类型可以写Unit
,或者不写
声明变量
只读变量,相当于Java中用final修饰的,使用val声明
val a: Int = 1
val b = 2 // 这里省略类型是因为此时类型是可以推断出来的
可变变量,使用关键字var声明
var c = 5 // 类型同样可推断
c += 5
字符串模板
Kotlin中有类似JavaScript的字符串模板
var c = 5
val s1 = "a is $c" // now, s1 = "a is 5"
val s2 = "abc"
val s3 = "$s2.length is ${s2.length}" // now, s3 = "abc.length is 3"
空安全
空安全从来都是一件让人头疼的事情,在Java里,你总是会由于没有做空安全保护说不定哪里就会报类似NullPointerException。
- 可空变量的声明
首先,下面这种做法是不行的
// eg1
var a: String = "abc"
a = null // compilation error
因为限定了a的类型是String,那么它就不可以持有null对象
怎么纠正?
// eg2
var b: String? = "abc"
b = null // OK
- 可空变量的访问
首先如果我们访问eg1中的a,比如
val l = a.length
这是没问题的,为什么呢,因为a被限定死是String类型,而且也只能被赋予String类型的值,那么,无论如何它不为空,一定有length成员
那么如果我们访问eg2中的b呢
val l = b.length // error: variable 'b' can be null
这时候,我们就需要做空保护了,传统地,我们可以像Java中做空保护一样这样写
if (b != null && b.length > 0) {
print("String of length ${b.length}")
} else {
print("Empty string")
}
或者用Kotlin的判断语句表达式
val l = if (b != null) b.length else -1
还有一种最便利的安全操作符?.
比如val l = b?.length
这种最方便于链式调用,比如
bob?.department?.name?.head
过程中有任意一项为空,表达式都会返回null