去年學習過一遍Kotlin,相比java而言,Kotlin確實有許多方便的地方,但是學習之後一直沒有真正拿來寫專案,很久不用很多東西都已經忘記了。最近Google宣佈Kotlin成為Android開發的官方語言之後,Kotlin突然變得火熱起來,我也打算複習一遍Kotlin的語法(主要是和java不同的地方)並用筆記記錄下來。
- 基本資料型別 數值型別
Type | Byte | Short | Int | Long | Float | Double |
---|---|---|---|---|---|---|
Bit Width | 8 | 16 | 32 | 64 | 32 | 64 |
字面常量
十進位制:123 長整型以大寫的 L 結尾:123L 16 進位制以 0x 開頭:0x0F 2 進位制以 0b 開頭:0b00001011 注意:8進位制不支援 Kotlin 同時也支援傳統符號表示的浮點數值: Doubles 預設寫法: 123.5, 123.5e10 Floats 使用 f 或者 F 字尾:123.5f
可以使用下劃線使數字常量更易讀:
val oneMillion = 1_000_000 val creditCardNumber = 1234_5678_9012_3456L val socialSecurityNumber = 999_99_9999L val hexBytes = 0xFF_EC_DE_5E val bytes = 0b11010010_01101001_10010100_10010010
Boolean 型別:true 和 false
- ** ===和==** 在 Kotlin 中,三個等號 === 表示比較物件地址,兩個 == 表示比較兩個值大小。
- 位運算 kotlin
var andResult = a and b
var orResult = a or b
var xorResult = a xor b
var rightShift = a shr 2
var leftShift = a shl 2
複製程式碼
java
int andResult = a & b;
int orResult = a | b;
int xorResult = a ^ b;
int rightShift = a >> 2;
int leftShift = a << 2;
複製程式碼
- 變數var和常量val
var a = "a"
var b = 1
var c: Int = 1
val d: Int = 1// 常量,相當於java中的final,建立的時候必須初始化
複製程式碼
- 方法 沒有返回值
fun foo(x: Int, y: Int) {}
複製程式碼
帶有返回值
fun foo(x: Int, y: Int): Int {
return x + y
}
複製程式碼
預設引數
fun foo(x: Int = 1, y: Int = 2): Int {
return x + y
}
複製程式碼
- 擴充套件
Kotlin 的擴充套件是指在不使用繼承的方式下對一個類的方法和屬性進行擴充套件,被擴充套件的類程式碼本身不會造成任何影響。
- 擴充套件函式,為ImageView擴充套件loadImage方法:
fun ImageView.loadImage(url: String) {
Glide.with(this.context).load(url).into(this)
}
複製程式碼
- 擴充套件屬性 擴充套件並不會真正給類新增了成員屬性,因此也沒有辦法讓擴充套件屬性擁有一個備份欄位.這也是為什麼初始化函式不允許有擴充套件屬性。擴充套件屬性只能夠通過明確提供 getter 和 setter方法來進行定義
var ImageView.index: Int
set(value) {
tag = value
}
get() = tag as Int
複製程式碼
val ImageView.area: Int
get() = width * height
複製程式碼
- 擴充套件的作用域: 擴充套件的作用域限於當前package,不同package的擴充套件可以通過import匯入使用
- Lambda表示式
textView.setOnClickListener { v -> Toast.makeText(v.context, "onClick", Toast.LENGTH_SHORT).show() }
複製程式碼
val sum: (Int, Int) -> Int = { x, y -> x + y }
sum(1,2)
複製程式碼
- Null指標
var p: Person? = null
var name = p!!.name //p為null丟擲NullPointerException
var age = p?.age//p不為null才會為age賦值
複製程式碼
- 字串 Kotlin 支援三個引號 """ 擴起來的字串
//輸出結果會保留換行
val text = """
java
kotlin
groovy
"""
複製程式碼
//刪除每行前面的空格
val text = """
|java
|kotlin
|groovy
""".trimMargin()
複製程式碼
- 字串模板
var name = "Katy Perry"
var age = "12"
var str = "My name is: $name,My age is $age"
var firstName = "My name is: ${name.substring(4)}"
複製程式碼
- When語句 when語句相當於java中的switch語句
when (any) {
is String ->
return "string"
is Int ->
return "Int"
is Boolean ->
return "Boolean"
else
-> return "other"
}
複製程式碼
- 控制語句返回值 if else
var a = if (x > y) x else y
var b = if (x > y) x else if (x < y) y else 0
複製程式碼
when
val result = when (any) {
is String ->
"string"
is Int ->
"Int"
is Boolean ->
"Boolean"
else
-> "other"
}
複製程式碼
- is Kotlin
if (x is Int) {}
複製程式碼
java
if(x instanceof Integer){ }
複製程式碼
- as kotlin
val s = a as? String
複製程式碼
型別轉換的時候可能會丟擲ClassCastException,在kotlin中可以使用as?,轉換失敗返回null,而不是丟擲異常 java
String text = (String) a;
複製程式碼
- in
if (x in 0..10) {}
for (i in 0..10) {}
複製程式碼
- Collections kotlin
var numbers = listOf(1, 2, 3)
var map = mapOf(1 to "One",
2 to "Two",
3 to "Three")
複製程式碼
java
List<Integer> numbers = Arrays.asList(1, 2, 3);
Map<Integer, String> map = new HashMap<>();
map.put(1,"One");
map.put(2,"Two");
map.put(3,"Three");
複製程式碼
kotlin
numbers.forEach {
println(it)
}
numbers.filter { it > 5 }
.forEach { println(it) }
複製程式碼
java
for (int number : numbers) {
System.out.println(number);
}
for (int number : numbers) {
if(number > 5) {
System.out.println(number);
}
}
複製程式碼
- 別名 型別別名為現有型別提供替代名稱,如果型別名稱太長,你可以另外引入較短的名稱,並使用新的名稱替代原型別名。
class Foo {
fun bar() {
println("foo")
}
}
typealias F = Foo
fun main(args: Array<String>) {
val f = F()
f.bar()
}
複製程式碼