包的聲明應處於文件頂部:
package my.demo import java.util.* // ……
帶有兩個Int參數、返回Int的函數:
fun sum(a: Int, b: Int): Int { return a + b }
將表達式作為函數體、返回值類型自動推斷的函數:
fun sum(a: Int, b: Int) = a + b
函數返回無意義的值:
fun printSum(a: Int, b: Int): Unit { println("sum of $a and $b is ${a + b}") }
Unit返回類型可以省略:
fun printSum(a: Int, b: Int) { println("sum of $a and $b is ${a + b}") }
定義只讀局部變量使用關鍵字val。只能為其賦值一次。
val a: Int = 1 // ⽴即賦值 val b = 2 // ⾃動推斷出 `Int` 類型 val c: Int // 如果沒有初始值類型不能省略 c = 3 // 明確賦值
可重新賦值的變量使用var關鍵字:
var x = 5 // ⾃動推斷出 `Int` 類型 x += 1
頂層變量
val PI = 3.14 var x = 0 fun incrementX() { x += 1 }
正如Java與JavaScript,kotlin支持行注釋及塊注釋。
// 這是⼀個⾏注釋 /* 這是⼀個多⾏的 塊注釋。*/
var a = 1 // 模板中的簡單名稱: val s1 = "a is $a" a = 2 // 模板中的任意表達式: val s2 = "${s1.replace("is", "was")}, but now is $a"
fun maxOf(a: Int, b: Int): Int { if (a > b) { return a } else { return b } }
使用if作為表達式:
fun maxOf(a: Int,b: Int) = if (a > b) a else b
當某個變量的值可以為null的時候,必須在聲明處的類型后添加 ?來標識該引用可為空。
如果str的內容不是數字返回null:
fun parseInt(str: String): Int? { // …… }
使用返回可空值的函數:
fun printProduct(arg1: String, arg2: String) { val x = parseInt(arg1) val y = parseInt(arg2) // 直接使⽤ `x * y` 會導致編譯錯誤,因為他們可能為 null if (x != null && y != null) { // 在空檢測后,x 與 y 會⾃動轉換為⾮空值(non-nullable) 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)
is運算符檢測一個表達式是否某類型的一個實例。如果一個不可變的局部變量或屬性已經判斷出為某類型,那么檢測后的分支中可以直接當作該類型使用,無需顯示轉換:
fun getStringLength(obj: Any): Int? { if (obj is String) { // `obj` 在該條件分⽀內⾃動轉換成 `String` return obj.length } // 在離開類型檢測分⽀后,`obj` 仍然是 `Any` 類型 return null }
或者
fun getStringLength(obj: Any): Int? { if (obj !is String) return null // `obj` 在這⼀分⽀⾃動轉換為 `String` return obj.length }
甚至
fun getStringLength(obj: Any): Int? { // `obj` 在 `&&` 右邊⾃動轉換成 `String` 類型 if (obj is String && obj.length > 0) { return obj.length } return null }
val items = listOf("apple", "banana", "kiwifruit") for (item in items) { println(item) }
或者
val items = listOf("apple", "banana", "kiwifruit") for (index in items.indices) { println("item at $index is ${items[index]}") }
val items = listOf("apple", "banana", "kiwifruit") var index = 0 while (index < items.size) { println("item at $index is ${items[index]}") index++ }
使用when表達式
fun describe(obj: Any): String = when (obj) { 1 -> "One" "Hello" -> "Greeting" is Long -> "Long" !is String -> "Not a string" else -> "Unknown" } }
使用in運算符來檢測某個數字是否在指定區間內:
val x = 10 val y = 9 if (x in 1..y+1) { println("fits in range") }
檢測某個數字是否在指定區間外:
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") }
區間迭代:
for (x in 1..5) { print(x) }
或數列迭代:
for (x in 1..10 step 2) { print(x) } println() for (x in 9 downTo 0 step 3) { print(x) }
對集合進行迭代:
for (item in items) { println(item) }
使用 in 運算符來判斷集合內是否包含某實例:
when { "orange" in items -> println("juicy") "apple" in items -> println("apple is fine too") }
使用lambda表達式來過濾(filter)與映射(map)集合:
val fruits = listOf("banana", "avocado", "apple", "kiwifruit") fruits .filter { it.startsWith("a") } .sortedBy { it } .map { it.toUpperCase() } .forEach { println(it) }
val rectangle = Rectangle(5.0, 2.0) // 不需要“new”關鍵字 val triangle = Triangle(3.0, 4.0, 5.0)
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。