Kotlin 是一種在 Java 虛擬機器上執行的靜態型別程式語言，它也可以被編譯成為 JavaScript 原始碼。它主要是由 JetBrains 在俄羅斯聖彼得堡的開發團隊所發展出來的程式語言，其名稱來自於聖彼得堡附近的科特林島。2012 年 1 月，著名期刊《》中 Kotlin 被認定為該月的最佳語言。雖然與 Java 語法並不相容，但在 JVM 環境中 Kotlin 被設計成可以和 Java 程式碼相互運作，並可以重複使用如 Java 集合框架等的現有。Hathibelagal 寫道，如果你正在為 Android 開發尋找一種替代程式語言，那麼應該試下 Kotlin。它很容易在 Android 專案中替代 Java 或者同 Java 一起使用。 歷史 2011 年 7 月，JetBrains 推出 Kotlin 專案，這是一個面向 JVM 的新語言，它已被開發一年之久。JetBrains 負責人 Dmitry Jemerov 說，大多數語言沒有他們正在尋找的特性，但是 Scala 除外。但是，他指出 Scala 的編譯時間過慢這一明顯缺陷。Kotlin 的既定目標之一是像 Java 一樣快速編譯。2012 年 2 月，JetBrains 以 Apache 2 許可證開源此專案。 JetBrains 希望這個新語言能夠推動 IntelliJ IDEA 的銷售。 Kotlin v10 於 2016 年 2 月 15 日釋出。這被認為是第一個官方穩定版本，並且 JetBrains 已準備從該版本開始的長期向後相容性。 在 Google IO 2017 中，Google 宣佈在 Android 上為 Kotlin 提供最佳支援。 語法 Kotlin 很明顯受到 Java、C、JavaScript、Scala、Groovy 等語言的影響。例如 Kotlin 可以直接透過 println Hello name 或 println Hello name 來使用字串模板，和古老的 shell script 類似。又如 Kotlin 中的分號是可選的，這類似 JavaScript，而且 Groovy、Scala 也有同樣的能力。Kotlin 常量定義關鍵字是 val（不同於變數定義關鍵字 var），表示固定值，這功能來自 Scala，Swift 也有類似功能。 需要注意，Kotlin 沒有關鍵字 new。 變數 使用 val（全稱為 value，即（固定的）值）關鍵字定義唯讀變數，定義後其值無法修改 val a Int 1 定義 a 為 Int 型別的唯讀變數，其值為 1 val b 2 自動檢測 b 為 Int 型別 使用 var（全稱為 variable，即變數）關鍵字定義可變變數。 var x 5 App 定義一個 Int，值為 5 x 1 修改值為 1 函式 使用 fun 關鍵字定義一個函式。 fun sum a Int b Int Int return a b 上例定義了一個傳入兩個 Int 變數，並返回兩數之和的求和函式。 程式的入口點 類似於 C、 C、 C、 Java 和 Go ， Kotlin 程式的入口點是一個名為 main 的函式。 main 函式有一個包含命令列選項的引數（從 Kotlin 13 開始是可選的）。 Kotlin 支援像 Perl 和 Unix shell 那樣的。 型別推斷也是支援的。 Hello world 範例 fun main val scope World println Hello scope fun main args ArrayString for arg in args println arg 函式擴充套件 Kotlin 與 C、JavaScript 類似，能夠擴充套件類別的新功能，而無需繼承該類別，或使用像裝飾器（decorator）這樣的任何型別的設計模式（design pattern）。擴充套件函式可以稱為 Kotlin 的核心，在標準庫裡到處充斥著擴充套件函式。 擴充套件函式是靜態分發的，也就是說，它們不是以接收者型別為準的虛擬函式。這意味著呼叫的擴充套件函式是由函式呼叫所在的表示式的型別來決定的，而不是由表示式執行時求值結果決定的。 在下述例子中，String 類別被擴展出一個成員 lastChar。 package MyStringExtensions fun StringlastChar Char get length 1 println KotlinlastChar 利用函式擴充套件，Kotlin 也支援運算子過載： overloading operator using an extension method operator fun Pointplus other Point Point return Point x otherx y othery val p1 Point 10 20 val p2 Point 30 40 println p1 p2 Point x40 y60 getter 和 setter Kotlin 像 C 一樣支援屬性（property）。 解包引數 類似 Python 解包（unpack）指的是對實際引數的解包，只需在前面加一個星號 即可，如 test（a） fun main args ArrayString val list listOf args args println list 函式巢狀 Kotlin 支援函式巢狀（nested functions），允許函式內再定義函式，類似 JavaScript、C 與 Python 語言。 class User val id Int val name String val address String fun saveUser user User fun validate user User value String fieldName String if valueisBlank throw IllegalArgumentException Cant save user userid empty fieldName validate user username Name validate user useraddress Address Save user to the database 解構宣告 Kotlin 支援解構宣告，這與 Python 的迭代解包相似。 例如，collection object 包含解構式可分離其元素 for index element in collectionwithIndex println index element 抽象類別 抽象類別（Abstract classes）定義抽象或純虛擬（Pure Virtual）佔位函式，需要被繼承。抽象類別預設是 open 的。 No need for the open keyword here its already open by default abstract class Animated This virtual function is already open by default as well abstract fun animate open fun stopAnimating fun animateTwice 類別屬性 Kotlin 提供下列的關鍵字來限制頂層（toplevel）宣告，用於控制類別與成員在繼承時的可見性（作用域）。它們可用於類別及其成員 public internal protected private 用於類別的成員宣告時，含義如下： public：全域性可見。此為預設的型別。 internal：在當前模組中可見。 protected：在當前類別的一級子類別中可見，如果子類別再被繼承，則在下一級子類別中不可見。 private：在當前類別中可見。 用於頂層宣告時，含義如下： public：全域性可見。此為預設的型別。 internal：在當前模組中可見。 private：在當前檔案中可見。 例如 Class is visible only to current module internal open class TalkativeButton Focusable method is only visible to current class private fun yell println Hey method is visible to current class and derived classes protected fun whisper println Lets talk 主建構函式 vs 二級建構函式 在 Kotlin 中類別可以有一個主建構函式以及多個二級建構函式。如果主建構函式沒有註解或可見性說明，則 constructor 關鍵字可以省略。如果建構函式中沒有其它操作，大括號也可以省略。 Example of class using primary constructor syntax Only one constructor required for this class class User val nickname String val isSubscribed Boolean true Kotlin 的二級建構函式更類似於 C C 和 Java。 Example of class using secondary constructor syntax more than one constructor required for this class class MyButton View Constructor 1 constructor ctx Context super ctx Constructor 2 constructor ctx Context attr AttributeSet super ctx attr Anko library Anko 是一組為 Kotlin 打造的函式庫，其功能是用來開發 Android UI 應用程式，現已棄用。 fun ActivityshowAreYouSureAlert process Unit alert title Are you sure message Are you really sure positiveButton Yes process negativeButton No cancel Kotlin 互動模式 Kotlin 除了編譯成 Java 位元組碼執行，也可以作為指令碼語言解釋執行，此特性使得 Kotlin 可以以互動模式執行。互動模式是指令碼語言具有的特性，直譯器可以立即執行使用者輸入的程式碼，並反饋執行結果。典型的語言有 Python、JavaScript（在 V8 引擎支援下）、Ruby。 kotlincjvm type help for help quit for quit 22 4 println Welcome to the Kotlin Shell Welcome to the Kotlin Shell Kotlin 也是指令碼語言 Kotlin 亦可視為指令碼語言（scripting language）。其指令碼存成 Kotlin source file kts，即成為可執行檔。 list_folderskts import javaioFile val folders File args 0listFiles file fileisDirectory foldersforEach folder println folder 為了執行 Kotlin 指令碼，我們在執行編譯器時再加上選項。 kotlinc script list_folderskts path_to_folder_to_inspect Kotlin 的 hello world 例子 fun main args ArrayString greet toplaceprint inline higherorder functions inline fun greet s String String greeting andAnother s infix functions extensions type inference nullable types lambda expressions labeled this elvis operator infix fun StringandAnother other Any buildString append thisandAnother append append other immutable types delegated properties lazy initialization string templates val greeting by lazy val doubleEl String ll hedoubleEl o sealed classes companion objects sealed class to companion object val place world extensions Unit fun Stringprint println this 空變數及其運算 Kotlin 對可以為空（nullable）的變數和不可以為空（nonnullable）的變數作了區分。所有的可空物件（nullable objects）必須在定義時加上 後置於型別之後。開發人員遇到 nullable objects 時要先確認 nullcheck 須被執行過，才能賦值。可空性是 Kotlin 型別系統中幫助開發者避免以往 Java 的 NullPointerException 錯誤的特性。 Kotlin 提供空安全（nullsafe）運算子給開發人員 可用於安全存取（safely access） 可能是空物件的函式或屬性。如果 object 為空（null） 該方法將不被呼叫，而且表示式的值一定為空（null）。 通常稱為（Elvis operator） fun sayHello maybe String neverNull Int use of elvis operator val name String maybe stranger println Hello name 使用安全導引（safe navigation）運算子 returns null if foo returns null or if foo is nonnull but bar returns null or if foo and bar are nonnull but baz returns null vice versa return value is nonnull if and only if foo bar and baz are nonnull foo bar baz 高階函式與 lambda Kotlin 亦支援高階函式和 lambdas 功能。lambda 是一種匿名函式，允許開發者直接將表示式定義為函式，這類似於 Python。 the following function takes a lambda f and executes f passing it the string lambda note that s String Unit indicates a lambda with a String parameter and Unit return type fun executeLambda f s String Unit f lambda Lambdas 可用大括弧來定義。如果 lambda 夾帶引數，他們可定義在大括弧內，並以運算子區隔。 the following statement defines a lambda that takes a single parameter and passes it to the println function val l c Any println c lambdas with no parameters may simply be defined using val l2 print no parameters 參考資料 外部連結 官方範例 官方網站 中文翻譯 Kotlin 教學 Category 程式設計語言 CategoryJava 平臺 CategoryJVM 程式語言 Category 面向物件的程式語言 Category 靜態型別程式語言 Category 使用 Apache 許可證的軟體 Category 自由軟體計劃 Category2011 年軟體 Category2011 年建立的程式語言