Kotlin學習筆記2——基本語法

前言

上一篇,我們學習了Kotlin中常用的基本數據類型,今天繼續來學習Kotlin中常用的基本語法。

包的定義與導入

包的聲明應處於源文件頂部:

package my.demo //包名定義
import kotlin.text.*  //導入包 
fun test() {} //函數定義,後面會講
class Runoob {} //類定義,後面會講

目錄與包的結構無需匹配:源代碼可以在文件系統的任意位置

程序入口點

Kotlin 應用程序的入口點是 main 函數。

fun main() {
    println("Hello world!")
}

變量定義

可變變量定義:var 關鍵字,不可變變量定義:val 關鍵字,只能賦值一次的變量(類似Java中final修飾的變量),定義變量的模板爲:

val <標識符> : <類型> = <初始化值>

常量與變量定義時都可以沒有初始化值,但是在引用前必須初始化
編譯器支持自動類型判斷,即聲明時可以不指定類型,由編譯器判斷。

val a: Int = 1
val b = 1       // 系統自動推斷變量類型爲Int
val c: Int      // 如果不在聲明時初始化則必須提供變量類型
c = 1           // 明確賦值

var x = 5        // 系統自動推斷變量類型爲Int
x += 1           // 變量可修改

如果變量再定義時不初始化值,可以用lateinit關鍵字修飾,然後後面在賦值

lateinit var a: Int
...
fun initData(){
	a = 10
}

函數定義

定義函數用fun關鍵字,格式爲:fun 函數名(參數名:參數類型,參數名:參數類型,…):返回類型(參數可以用多個)。
定義一個帶有兩個 Int 參數、返回 Int 的函數:

fun sum(a: Int, b: Int): Int {
    return a + b
}

將表達式作爲函數體、返回值類型自動推斷的函數:

fun sum(a: Int, b: Int) = a + b

函數返回無意義的值,類似Java中的void:

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}")
}

可變長參數函數

函數的變長參數可以用 vararg 關鍵字進行標識:

fun vars(vararg v:Int){
    for(vt in v){
        print(vt)
    }
}
// 測試
fun main(args: Array<String>) {
    vars(1,2,3,4,5)  // 輸出12345
}

lambda(匿名函數)

sumLambda匿名函數名,第一個括號中兩個Int類型爲參數類型,->後面是返回結果類型,=號後表達式是函數體,函數體中的x、y表示參數的實例,第二個->後面是具體的邏輯。

// 測試
fun main(args: Array<String>) {
    val sumLambda: (Int, Int) -> Int = {x,y -> x+y}
    println(sumLambda(1,2))  // 輸出 3
}

註釋

與大多數現代語言一樣,Kotlin 支持單行(或行末)與多行(塊)註釋。

// 這是一個行註釋

/* 這是一個多行的
   塊註釋。 */

Kotlin 中的塊註釋可以嵌套。

/* 註釋從這裏開始
/* 包含嵌套的註釋 */     
並且在這裏結束。 */

字符串模板

這個在上篇文章Kotlin中常用的基本數據類型已經講過了,這裏再重新溫習下。
字符串字面值可以包含模板表達式 ,即一些小段代碼,會求值並把結果合併到字符串中。 模板表達式以美元符($)開頭,由一個簡單的名字構成:

val i = 10
println("i = $i") // 輸出“i = 10”

或者用花括號括起來的任意表達式:

val s = "abc"
println("$s.length is ${s.length}") // 輸出“abc.length is 3”

原始字符串與轉義字符串內部都支持模板。 如果你需要在原始字符串中表示字面值 $ 字符(它不支持反斜槓轉義),你可以用下列語法:

val price = """
${'$'}9.99
"""

條件表達式

fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

在 Kotlin 中,if 也可以用作表達式:

fun maxOf(a: Int, b: Int) = if (a > b) a else b

空值與 null 檢測

Kotlin的空安全設計對於聲明可爲空的參數,在使用時要進行空判斷處理,有兩種處理方式,字段後加!!像Java一樣拋出空異常,另一種字段後加?可不做處理返回值爲 null或配合?:做空判斷處理

//類型後面加?表示可爲空
var age: String? = "23" 
//age如果爲空,拋出空指針異常
val ages = age!!.toInt()
//age如果爲空,不做處理返回 null
val ages1 = age?.toInt()
//age如果爲空,配合?:使用返回-1
val ages2 = age?.toInt() ?: -1

當一個引用可能爲 null 值時, 對應的類型聲明必須明確地標記爲可爲 null。
以下實例演示如何使用一個返回值可爲 null 的函數:

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("'$arg1' or '$arg2' is not a number")
    }    
}

for 循環

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]}")
}

有關for 循環更多詳細的用法,我們後面講循環的時候再說,這裏只展示基本用法。

when 表達式

fun describe(obj: Any): String =
    when (obj) {
        1          -> "One"
        "Hello"    -> "Greeting"
        is Long    -> "Long"
        !is String -> "Not a string"
        else       -> "Unknown"
    }

有關when 表達式更多詳細的用法,我們後面講when 表達式的時候再說,這裏只展示基本用法。

區間

區間表達式由具有操作符形式 … 的 rangeTo 函數輔以 in 和 !in 形成。

區間是爲任何可比較類型定義的,但對於整型原生類型,它有一個優化的實現。以下是使用區間的一些示例:

for (i in 1..4) print(i) // 輸出“1234”

for (i in 4..1) print(i) // 什麼都不輸出

if (i in 1..10) { // 等同於 1 <= i && i <= 10
    println(i)
}

// 使用 step 指定步長
for (i in 1..4 step 2) print(i) // 輸出“13”

for (i in 4 downTo 1 step 2) print(i) // 輸出“42”


// 使用 until 函數排除結束元素
for (i in 1 until 10) {   // i in [1, 10) 排除了 10
     println(i)
}

集合

  • Kotlin集合類可以分爲:可變集合類(Mutable)和不可變集合類(Immutable)。
  • 常用的集合類主要有三種:List(列表)、Set(集)和Map(映射)
  • List容器中的元素以線性方式存儲,集合中可以存放重複對象。列表中的數據是有序排列
  • Set集容器的元素無序、不重複。
  • Map映射的持有的是 鍵值對 對象每一個對象都包含一堆 K-V對象。Map存儲的容器中每一個對象都有一個Key對象,Key決定對象在容器中的位置。關鍵字Key是唯一的。關鍵字本身並不能決定對象的存儲位置,它通過散列產生一個 散列碼 的整數值,這個散列碼對應值Value的存儲位置。
  • 如果從數據結構本身來看List中的下標就是Key,只不過key是有序的Int類型,所以說List也可以成爲特殊的Map數據結構。而Set也是Key爲Int值,但是Value不能重複。

這裏以List爲例對集合進行迭代:

var items = listOf(1,2,3,4)
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) }

這裏先大概展示下集合的常用的使用方法,詳細用法後面講集合的時候再介紹。

創建基本類及其實例

相比java創建對象再也不用new了

val rectangle = Rectangle(5.0, 2.0)
val triangle = Triangle(3.0, 4.0, 5.0)

尾巴

今天的學習筆記就先到這裏了,下一篇我們將學習Kotlin中的條件控制
老規矩,喜歡我的文章,歡迎素質三連:點贊,評論,關注,謝謝大家!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章