Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 基礎(chǔ)介紹
Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 流程控制
Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 特殊的類
Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 函數(shù)
Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 集合
Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 作用域
Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 代理
Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 產(chǎn)品級特性
翻譯來源
Named Arguments
和其他語言(java, c++,之類的)不同的是kotlin提供了一種特性叫命名參數(shù)。既可以和別的語言一樣按照定義的方法的參數(shù)順序來傳遞參數(shù),也可以通過名字來傳遞參數(shù),這樣就避免了錯誤的順序會帶來的錯誤以及可以更清晰地調(diào)用。有些錯誤是很難以通過編譯器來檢查出編譯錯誤的。比如這樣
fun format(userName: String, domain: String) = "$userName@$domain"
fun main() {
println(format("mario", "example.com")) // 1
println(format("domain.com", "username")) // 2
println(format(userName = "foo", domain = "bar.com")) // 3
println(format(domain = "frog.com", userName = "pepe")) // 4
}
- 1 傳遞了兩個參數(shù)
- 2 同樣也是傳遞了兩個參數(shù),但是在這里其實是發(fā)生了業(yè)務(wù)上的錯誤的。如果你使用命名參數(shù)就可以更清晰地發(fā)現(xiàn)這個問題。
- 3 這里就使用了命名參數(shù),是不是很清晰呀!
- 4 命名參數(shù)可以隨意交換順序哦
String Templates string模板
String 模板可以允許你在string被需要使用(比如println的時候string 被需要使用)的時候,將寫在String 中的引用和表達(dá)式替換成真正的值。
fun main() {
val greeting = "Kotliner"
var i = 1
var str = "Hello $i"
i = 2
println(str)
println("Hello $i")
str = "Hello ${++i}"
println("Hello $i")
println("Hello $greeting") // 1
println("Hello ${greeting.toUpperCase()}") // 2
}
/*
1
2
3
Hello Kotliner
Hello KOTLINER
*/
- 1 打印一個在String 中的變量應(yīng)用 用
$開頭表示 - 2 打印一個在String 中的表達(dá)式, 用
$開頭,用大括號包起來。
Destructuring Declarations 解構(gòu)聲明
解構(gòu)聲明 可以讓你在只需要一個實例的成員的時候,可以用簡單的幾句就獲取到你想要的結(jié)果。
fun findMinMax(list: List<Int>): Pair<Int, Int> {
// do the math
return Pair(50, 100)
}
fun main() {
val (x, y, z) = arrayOf(5, 10, 15) // 1
println("$x, $y, $z")
val map = mapOf("Alice" to 21, "Bob" to 25)
for ((name, age) in map) { // 2
println("$name is $age years old")
}
val (min, max) = findMinMax(listOf(100, 90, 50, 98, 76, 83)) // 3
println("$min, $max")
}
/*
5, 10, 15
Alice is 21 years old
Bob is 25 years old
50, 100
*/
- 1 將array的 三個元素分別賦值給 x y z
- 2 將map的entry 分為 name 和 age 兩個屬性,在for循環(huán)中
- 3 這里的i情況其實和2 是差不多的 就是將pair 分為賦值給 min 和max。這里返回值也可以作為解構(gòu)聲明的一部分
data class User(val username: String, val email: String) // 1
fun getUser() = User("Mary", "mary@somewhere.com")
fun main() {
val user = getUser()
val (username, email) = user // 2
println(username == user.component1()) // 3
val (_, emailAddress) = getUser() // 4
}
- 1 定義一個data class
- 2 將user的 兩個屬性按照名字解構(gòu)說明分給兩個不可變變量
- 3 這里返回的是 true。這里通過自動編碼加進(jìn)去的
componentN()方法來獲取user的第幾個屬性。 - 4 解構(gòu)聲明也可以忽略某個屬性,這里和go語言的多返回值很像。這里忽略的意義就是告知編譯器,不需要處理這個屬性的解構(gòu),能提高性能。
class Pair<K, V>(val first: K, val second: V) { // 1
operator fun component1(): K {
return first
}
operator fun component2(): V {
return second
}
}
fun main() {
val (num, name) = Pair(1, "one") // 2
println("num = $num, name = $name")
}
- 1 定義一個自己定義的Pair 類,包括自己定義 component1 和 component2 方法。
- 2 解構(gòu)一個類,就是利用這個pair 這樣的方式來做到的。
Smart Casts 靈活的類型轉(zhuǎn)化
kotlin的編譯器(這說明可以在ide中就這么操作不需要編碼進(jìn)行類型轉(zhuǎn)化)可以靈活的進(jìn)行大多數(shù)情況的類型轉(zhuǎn)化,包括但不限于以下兩種:
- 將可空類型靈活的轉(zhuǎn)變?yōu)閷?yīng)的不可控類型
- 從父類型轉(zhuǎn)化為子類型
import java.time.LocalDate
import java.time.chrono.ChronoLocalDate
fun main() {
val date: ChronoLocalDate? = LocalDate.now() // 1
if (date != null) {
println(date.isLeapYear) // 2
}
if (date != null && date.isLeapYear) { // 3
println("It's a leap year!")
}
if (date == null || date.isLeapYear) { // 4
println("There's no Feb 29 this year...")
}
if (date is LocalDate) {
val month = date.monthValue // 5
println(month)
}
}
/*
true
It's a leap year!
There's no Feb 29 this year...
10
*/
- 1 定義一個可空類型的變量
- 2 判空之后date 自動轉(zhuǎn)變成了他相對應(yīng)的非空類型
- 3 在這里將會進(jìn)行一個如2里面的 類型轉(zhuǎn)化,這是由于和java中一樣,有判斷捷徑存在。(即當(dāng)兩個boolean && 的時候第一個為true 才會進(jìn)行下一個判斷,如果第一個為false,將不會進(jìn)行下一個判斷)
- 4 同3 理
- 5 這里便捷地將父類轉(zhuǎn)化成了子類。這一點在java中可以很麻煩地哦