1.概述
今年google I/O以后,Kotlin已成为Android官方支持的语言了,刚学Android时,听过这门语言,但当时也没有太在意,也没有刻意去了解过它。今年I/O过后,Kotlin已成为Android官方头号支持语言,Github上的热搜榜首。作为搞Android的,怎么能不了解下新技术,不然就跟不上现在的开发节奏了。
Kotlin和Java一样也是基于JVM的,它是静态的编程语言,由 JetBrains 开发,可以适用于多个平台,服务端,Android端,网页端。它可以和JDK6完全兼容,保障Kotlin应用程序可以在以前的旧版本上运行而无兼容问题。在预览的AS3.0已经可以支持Kotlin,但是在之前的版本上使用要在插件库中安装Kotlin插件,由于网络问题,很可能安装失败,这里提供一个VPN,只要使用的时候去官网签个到就可以每天免费使用两个小时。
为什么要使用Kotlin? 它具有几个比较显著的特点,其一,可以简化代码的书写量,我们在绑定Android的控件,经常要写大量的findViewById,这无疑是很蛋疼的,当然butterknife可以简化部分代码,但是也简化不了多少,使用Kotlin,可以大大简化代码的书写量,我们使用时只需要将控件中的引用直接拿着用就可以了。其二,避免空指针异常,真正做过项目的人,应该知道,NullpointExecption是开发人员最头疼的,一不小心App就会崩溃,使用Kotlin可以将这种错误提前至编译期,减少了App的异常崩溃率。
我们在用Kotlin开发程序时,可以和JAVA代码互相调用,可以充分调用各自的api开发自己的程序。同时我们可以使用任何JAVA IDE或者使用命令行构建自己的应用程序。
接下来的这些是这几天观看官方文档的总结,也算记录下吧。
2.基础
1)基础语法
数字
Kotlin提供了以下的内置类型来表示数字
Type | Bit Width |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
Kotlin 中字符不是数字
表达方式
在Kotlin中较小的类型是不能隐式转化为较大的类型,可以显示转化来拓展数字。每个数字支持如下的转换:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
但是算术运算会有重载做适当转换
位运算
对于位运算,没有特殊字符来表示,而且只适用中缀方式调用命名函数
val x = (1 shl 2) and 0x000FF000
完整的位运算列表(只用于 Int 和 Long)
shl(bits) – 有符号左移 (Java 的 <<)
shr(bits) – 有符号右移 (Java 的 >>)
ushr(bits) – 无符号右移 (Java 的 >>>)
and(bits) – 位与
or(bits) – 位或
xor(bits) – 位异或
inv() – 位非
字符串模板
字符串可以包含模板表达式,它通常以($)开头,由一个简单的名字构成,当我们想将值加进代码,可以通过这种方式合并到字符串中
val i = 10
val s = "i = $i" // 求值结果为 "i = 10"
复杂时可以用花括号括起来。
2)控制流
If表达式
在Kotlin中是会有返回值的,返回的是表达式中最后一句话(注意:Kotlin中是可以不写分号,这是很方便的特性),If可以胜任三元运算符
// 作为表达式
val max = if (a > b) a else b
When表达式
When取代的是Switch,其基本表达式可以如下
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意这个块
print("x is neither 1 nor 2")
}
}
可以从代码块看出非常直观,如果编译器不能检测出所有可以满足的情况,则必须有else分支。有多个相同的方式处理,可以将分支放在一起,用逗号隔开。
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
可以检测一个值在(in)或者不在(!in)一个区间集合中
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
when如果不提供参数,所有的分支都是简单的布尔表达式。
For循环
For循环可以对任何提供迭代器(iterator)对象进行迭代,语法如下:
for (item in collection) print(item)
可以通过索引遍历数组或list
for (i in array.indices) {
print(array[i])
}
注意这种“在区间上遍历”会编译成优化的实现而不会创建额外对象。
用库函数 withIndex遍历
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
While循环
和java里面的语法一样
3)返回和跳转
Kotlin三种结构化跳转表达式:return,break,continue。
@标签
在 Kotlin 中任何表达式都可以用标签(label)来标记。 标签的格式为标识符后跟 @ 符号,例如:abc@、fooBar@都是有效的标签。 要为一个表达式加标签,我们只要在其前加标签即可。
loop@ for (i in 1..100) {
for (j in 1..100) {
if (……) break@loop
}
}
标签限制的 break 跳转到刚好位于该标签指定的循环后面的执行点。 continue 继续标签指定的循环的下一次迭代。
标签处返回
在java中使用return直接会从函数返回,当我们在Kotlin中使用标签限制的return语句可以从lambda表达式中返回,我们可以给return加以标签限制return。
fun foo() {
ints.forEach lit@ {
if (it == 0) return@lit
print(it)
}
}
甚至可以省略隐式标签更加方便,该标签与接受该 lambda 的函数同名。
fun foo() {
ints.forEach {
if (it == 0) return@forEach
print(it)
}
}
使用匿名函数可以直接从匿名函数自身返回
fun foo() {
ints.forEach(fun(value: Int) {
if (value == 0) return
print(value)
})
}
当要返一个回值的时候,解析器优先选用标签限制的 return,即
return@a 1
直接从标签@a处返回1。
结尾
这节就记录到这里,后面一节会记录类和对象,本篇内容基本参考Kotlin官方中文文档,具体详细的可以参考官方文档。虽然简单,但是这是为后面的深入学习打基础。