【Kotlin】第1課-宣告變數與方法

繼 Java 之後,近年來有個叫做 Kotlin 的語言興起,它能用來開發在 JVM 上運行的程式。換句話說,透過 Java 開發的專案,我們也能用 Kotlin 做一個。此外 Google 也宣佈 Kotlin 是開發 Android App 的首選語言。

透過這系列文章,希望能幫助學過 Java 的人上手 Kotlin 的語法。本文的篇幅稍長,首先會建立一個程式專案。接著再示範宣告變數與方法,最後講解 null 值的處理方式,這些都是息息相關的。

一、建立程式專案

本系列文章的開發工具使用「IntelliJ」,請到這個網址下載安裝
https://www.jetbrains.com/idea/download/

開啟後首先點選「Create New Project」。

在左邊選擇 Kotlin,接著選擇右邊的「Kotlin/JVM」,代表這個專案會在 JVM 上運行。之後再輸入專案名稱與儲存位置即可建立完成。

接著在專案的 src 目錄下建立一個啟動檔案,並且要有 package。這個檔案就如同 Java 的 Main 類別與 main 方法,是程式的進入點。Kotlin 不需要 Main 類別,只要遵照規定的方法名稱(main)與參數型態(Array<String>),宣告好啟動方法就能執行。建立好後撰寫如下的 Hello World 程式,按下三角形圖案執行後,會印出一個訊息。

二、宣告變數

Kotlin 的基本資料型態與 Java 相同,包括:Byte、Short、Int、Long、Float、Double、Char與 Boolean。但在 Kotlin,它們都是大寫字母開頭。此外也有 String 可使用。

在宣告時,會用到「var」與「val」的關鍵字,前者是用在可以改變值的變數,後者則是常數。以下是宣告變數的例子。

val id: String = "10346000"
var name: String = "Vincent"
var age: Int = 23
var isActive: Boolean = true

與 Java 不同的地方是,Kotlin 的資料型態放在變數名稱後面,並用冒號隔開,最前面則定義變數或常數。另外若宣告時就給予初始值,資料型態可以省略不寫,Kotlin 會自動定義型態。

val id = "10346000"
var name = "Vincent"
var age = 23
var isActive = true

要留意的是,以這種方式宣告,若初始值給予的是數字,型態為 Int。若要宣告 Long,需在數值後方加上 L 或 l 字眼。
若初始值給予的是浮點數,型態為 Double。若要宣告 Float,需在數值後方加上 F 或 f 字眼。

假如有轉換型態的需求,例如將 Int 轉為 Long、將 Double 轉為 String,Kotlin 也有提供相關方法。方法名稱都是「to」加上資料型態的形式,範例如下。

val timeMills = 60 * 1000.toLong()
val interestStr = (25000 * 0.03 * 9 / 12).toString()

三、宣告方法

Kotlin 宣告方法的方式與 Java 的主要差別,在於將資料型態寫在後方。另外宣告時會加上「fun」關鍵字。以下是一些例子。

fun showMemberInfo(id: String, name: String): Unit {
println("Id: " + id)
println("Name: " + name)
}

fun calcInterest(money: Int, rate: Double, month: Int): Double {
return money * rate * month / 12
}

第一個方法的回傳值型態是「Unit」,它就像 Java 的 void,是沒有回傳值的意思,且 Unit 字眼可以省略。第二個方法是回傳 Double。

其中第二個方法的回傳值是簡單的計算結果,若只要一個程式敘述就能回傳,我們能省略回傳值型態與大括號,簡寫成如下。與宣告變數有異曲同工之妙,Kotlin 會根據結果來定義型態。

fun calcInterest(money: Int, rate: Double, month: Int) = money * rate * month / 12


四、參數的傳遞順序與預設值

如果有一個方法,使用時需要傳入很多參數,或是不容易記得它們的順序,那用起來就會不方便,例如當參數全部都是字串的時候。

Kotlin 讓我們能以任意的順序來傳入參數,只要在傳入時指定要賦值給哪個參數就好。以上一節所宣告的計算利息的方法為例,我們可以這樣使用。

calcInterest(month = 9, rate = 0.03, money = 25000)

隨著傳入參數的方式變彈性了,我們甚至能只傳其中幾個參數,其餘沒傳的部份就用預設值。方法參數的預設值直接在後方用「=」符號定義即可,範例如下。

fun calcInterest(money: Int, rate: Double, month: Int = 12) = money * rate * month / 12


五、字串模板

使用 Java 時,若要根據某種格式產生字串,可能會使用 String.format 方法。這在 Kotlin 也能繼續使用,但還有另一種好做法,就是字串模板。

回想 Java 的 String.format,它的第一個參數是模板,包含著「佔位符」,後面的參數才是用來填入的資料。而 Kotlin 的字串模板捨棄了佔位符,直接將資料安插在模板中,使用方式如下。

val name = "Vincent"
val info = "$name : ${calcInterest(30000, 0.03)}"

// 印出:Vincent : 900.0
println(info)

只要在字串的引號中使用「${}」語法,在中間安插資料就行了。資料可以是變數或有回傳值的方法。有時IntelliJ會提示省略大括號,讀者可以照著修改。但筆者認為不需要硬記什麼情況可省略。全部加大括號是最保守的,之後省略久就會記起來了。

六、Null 值的處理

前面的範例,宣告變數時都會賦予一個確切的值,但若給予 null 值,則開發工具會出現錯誤訊息。這是 Kotlin 為了避免 NullPointerException 例外的可能性,所具有的一項特色。

若還是要操作 null 值的話,會有一些規則。在宣告變數或方法時,資料型態需要加上「?」符號,意味著變數值或回傳值可能為 null。而使用這類變數的方法時,也得加上問號。範例如下。

var s: String? = "Vincent"
println(s?.toUpperCase()) // 印出:VINCENT

s = null
println(s?.toUpperCase()) // 印出:null

上面的程式中,呼叫了將字串轉大寫的 toUpperCase 方法,它是有回傳值的。因此在遇到字串為 null 的情況下,該方法會回傳 null,不會拋出例外。若使用無回傳值的方法,當遇到變數是 null 值時,則不執行。若讀者有寫過 Java,可看成下面兩種寫法的簡化。

Student student = new Student();

// 寫法一
if (student != null) {
student.printInfo();
}

// 寫法二
Optional.ofNullable(student).ifPresent(stu -> stu.printInfo());

在處理可能為 null 值的變數時,也有機會用到「!!」符號。它代表的意義是,遇到變數值很不巧是 null 的情況,開發者要自行承擔 NullPointerException 的例外,範例如下。

var s1: String? = "10.25"
println(s1!!.toDouble()) // 印出:10.25

var s2: String = s1!!
println(s2.toDouble()) // 印出:10.25

s1 = null
println(s1!!.toDouble()) // 拋出例外:對null值使用方法

s2 = s1!! // 拋出例外:String型態不接受null值,String?才能

下一篇:【Kotlin】第2課-條件判斷

留言