基礎(chǔ)語(yǔ)法
定義包
包說明需要定義在源文件的最頂部
package my.demo
import java.util.*
// ...
文件路徑與包不需要完全匹配:源文件可以放在文件系統(tǒng)的任意位置
定義函數(shù)
函數(shù)有兩個(gè) Int 型參數(shù)吹泡,返回類型也為 Int 型
fun sum(a: Int, b: Int): Int {
return a + b
}
函數(shù)主體為表達(dá)式匾效,返回類型為被推斷的類型
fun sum(a: Int, b: Int) = a + b
函數(shù)無返回值
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}")
}
無返回值的函數(shù) Unit 可以省略
fun printSum(a: Int, b: Int) {
println("sum of $a and $b is ${a + b}")
}
定義變量
定義常量
val a: Int = 1 // 立即賦值
val b = 2 // 被推測(cè)為 Int 類型
val c: Int // 無初始化值時(shí),必須注明類型
c = 3 // 延遲賦值
定義變量
var x = 5 // 被推測(cè)為 Int 類型
x += 1
注釋
就像 java 和 JavaScript 一樣,kotlin 也支持單行筐乳、多行注釋
// 單行注釋
/* 多行
注釋塊 */
與 java 不同的是歌殃,kotlin 的注釋塊可以嵌套
java:
kotlin:
使用字符串模板
var a = 1
// 普通變量在模板中:
val s1 = "a is $a"
a = 2
// 表達(dá)式在模板中:
val s2 = "${s1.replace("is", "was")}, but now is $a"
使用條件表達(dá)式
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
使用 if 作為單一表達(dá)式
fun maxOf(a: Int, b: Int) = if (a > b) a else b
使用可空變量和判斷空值
如果變量可空,需要明確注明該變量是可空的蝙云。
如果字符串不能轉(zhuǎn)化為 Int 類型氓皱,則返回空
fun parseInt(str: String): Int? {
// ...
}
可能返回為空的函數(shù)
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
// x、y 可能為空,會(huì)導(dǎo)致 x * y 出錯(cuò)
if (x != null && y != null) {
// 空值檢查后波材,x 和 y 均非空
println(x * y)
}
else {
println("either '$arg1' or '$arg2' is not a number")
}
}
或者
// ...
if (x == null) {
println("Wrong number format in arg1: '${arg1}'")
return
}
if (y == null) {
println("Wrong number format in arg2: '${arg2}'")
return
}
// 空值檢查后股淡,x 和 y 均非空
println(x * y)
使用類型判斷和類型自動(dòng)轉(zhuǎn)換
is 操作符可以判斷變量類型。已經(jīng)被確定類型的本地常量或者屬性廷区,不需要顯示類型轉(zhuǎn)換:
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` 在這個(gè)分支里自動(dòng)轉(zhuǎn)換成了 `String` 類型
return obj.length
}
// `obj` 在類型判斷的分之外還是 `Any` 類型
return null
}
或者
fun getStringLength(obj: Any): Int? {
if (obj !is String) return null
// `obj` 在這個(gè)分支里自動(dòng)轉(zhuǎn)換成了 `String` 類型
return obj.length
}
甚至是
fun getStringLength(obj: Any): Int? {
// `obj` 在`&&`右邊自動(dòng)轉(zhuǎn)換成了 `String` 類型
if (obj is String && obj.length > 0) {
return obj.length
}
return null
}
使用循環(huán)
val items = listOf("apple", "banana", "kiwi")
for (item in items) {
println(item)
}
或者
val items = listOf("apple", "banana", "kiwi")
for (index in items.indices) {
println("item at $index is ${items[index]}")
}
使用while 循環(huán)
val items = listOf("apple", "banana", "kiwi")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
使用表達(dá)式 when
fun describe(obj: Any): String =
when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}
使用范圍
判斷一個(gè)數(shù)字是否在某個(gè)范圍內(nèi)用 in 操作符
val x = 10
val y = 9
if (x in 1..y+1) {
println("fits in range")
}
判斷數(shù)字是否超出范圍
val list = listOf("a", "b", "c")
if (-1 !in 0..list.lastIndex) {
println("-1 is out of range")
}
if (list.size !in list.indices) {
println("list size is out of valid list indices range too")
}
在范圍內(nèi)循環(huán)
for (x in 1..5) {
print(x)
}
或者按步長(zhǎng)循環(huán)
for (x in 1..10 step 2) {
print(x)
}
for (x in 9 downTo 0 step 3) {
print(x)
}
使用集合
在集合內(nèi)循環(huán)
for (item in items) {
println(item)
}
判斷集合內(nèi)是否包含某個(gè)對(duì)象用 in 操作符
when {
"orange" in items -> println("juicy")
"apple" in items -> println("apple is fine too")
}
使用 lambda 表達(dá)式過濾(filter)或者映射(map)集合
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { println(it) }
生詞表
單詞 | 含義 |
---|---|
syntax | n. 語(yǔ)法唯灵;句法;有秩序的排列 |
specification | n. 規(guī)格隙轻;說明書埠帕;詳述 |
arbitrarily | adv. 武斷地;反復(fù)無常地玖绿;專橫地 |
arbitrary | adj.任意(性)的敛瓷,隨意的;(個(gè)人)主觀武斷的斑匪,隨心所欲的呐籽;反復(fù)無常的,任性多變的蚀瘸,無定見的狡蝶,變幻莫測(cè)的;專制的苍姜,專斷的牢酵,專橫的 |
omitted | adj. 省略了的;省去的 v. 遺漏衙猪,省略(omit的過去分詞) |
mutable | adj. 易變的馍乙,不定的;性情不定的 |
nested | adj. 嵌套的垫释,內(nèi)裝的 v. 筑巢丝格;嵌入(nest的過去分詞) |
progression | n. 前進(jìn);連續(xù) |