概述
这是我个人学习Kotlin的一些学习笔记,这里是与Java作对比,比较这门与Java语言有哪些不同的地方,并且只对与Java不同点进行讲解。这样更能快速的学习者个语言。此系列文章需要有Java基础的童鞋。
Kotlin是什么?为什么要学习?
这个问题,我也不废话,直接借用他人的话来描述:
Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。
由于以下优点,所以我觉得Kotlin值得学习:
- 简洁: 大大减少样板代码的数量,比如不用写分号结束
- 安全: 避免空指针异常等整个类的错误。
- 互操作性: 充分利用 JVM、Android 和浏览器的现有库。
- 工具友好: 可用任何 Java IDE 或者使用命令行构建。
数据类型
Kotlin中的数据类型与Java不同的是,它的所有数据类型都是对象。
-
数字
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8
用法和Java基本一致,就是没有隐式的拓宽转换。还有就是可以这么玩:
val creditCardNumber = 1234_5678_9012_3456L
val hexBytes = 0xFF_EC_DE_5E
所有类型都可以不需要显示申明,Kotlin会自动的根据上下文推断出来。
至于怎么显示转换,这里和Java还是不一样的,不能直接将一个Int类型的赋值给Long类型的,比方说下面这样的的:
val b: Byte = 1 // OK, 字面值是静态检测的
val i: Int = b // 错误
只能用转换方法:
val b: Byte = 1
val i: Int = b.toInt()
或者可以利用上下文的推断来进行拓宽,比如这样:
val l = 1L + 3 // Long + Int => Long
至于运算方面有一点:
shl(bits) – 有符号左移 (Java 的 <<)
shr(bits) – 有符号右移 (Java 的 >>)
ushr(bits) – 无符号右移 (Java 的 >>>)
and(bits) – 位与
or(bits) – 位或
xor(bits) – 位异或
inv() – 位非
还有一点比较符就是 in,这个在循环里面比较常用。它表示在某个区间内,例如在0...100区间,也可以是在一个数组或者集合的区间。
val array = 1..100
for (value in array) {
print("value = $value")
}
字符
这个和Java基本差不多,就是字符不能被当做数字来用。数组
Kotlin的数组和Java相比,用法类似,就是创建数组的方式有了很大的不同。比如创建数组可以有以下几种方式:
arrayOf(1, 2, 3) 创建了 array [1, 2, 3]
val arr = arrayOfNulls<Int>(10) 可以用于创建一个指定大小的、所有元素都为空的数组
// 创建一个 Array<String> 初始化为 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })
-
字符串
这里基本和Java差不多,但是这里有个非常有用的功能,就是字符串面值。字符串可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符($)开头,由一个简单的名字构成,直接看代码:
val i = 10
val s = "i = $i" // 求值结果为 "i = 10"
导包
Kotlin的导包其实和Java是类似的,但是我们在用Java导包的时候回遇到一个问题,那就是如果引用的两个库包名重读了,这个时候就不知道导入的是谁的。在这里,Kotlin可以利用as来消除命名冲突歧义:
import foo.Bar // Bar 可访问
import bar.Bar as bBar // bBar 代表“bar.Bar”
控制
-
If
首先在kotlin中是没有三元运算符的,因为if就是一个表达式,而不是一个语句,所以if可以代替三元运算符的功能,比如:
// 作为表达式
val max = if (a > b) a else b
-
When,switch的完美升级替换者
when既可以做表达式也可以做为语句使用,如果作为表达式就必须要有else分支。
//简单形式
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意这个块
print("x is neither 1 nor 2")
}
}
//把多个分支条件放在一起
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
// 用任意表达式(而不只是常量)作为分支条件
when (x) {
parseInt(s) -> print("s encodes x")
else -> print("s does not encode x")
}
//检测一个值在(in)或者不在(!in)一个区间或者集合中检测一个值在(*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")
}
//检测一个值是(is)或者不是(!is)一个特定类型的值。
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
//取代 if-else if链。
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
跳转
在 Kotlin 中任何表达式都可以用标签(label)来标记。 标签的格式为标识符后跟 @ 符号
loop@ for (i in 1..100) {
for (j in 1..100) {
if (……) break@loop
}
}