Kotlin

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 v1.0於2016年2月15日釋出。這被認為是第一個官方穩定版本，並且JetBrains已準備從該版本開始的長期向後相容性。在Google I/O 2017中，Google宣佈在Android上為Kotlin提供最佳支援。語法.Kotlin很明顯受到Java、C#、JavaScript、Scala、Groovy等語言的影響。例如Kotlin可以直接透過codice_1或codice_2來使用字串模板，和古老的shell script類似。又如Kotlin中的分號是可選的，這類似JavaScript，而且Groovy、Scala也有同樣的能力。Kotlin常量定義關鍵字是codice_3，表示固定值，這功能來自Scala，Swift也有類似功能。需要注意，Kotlin沒有關鍵字codice_5。變數.使用codice_3關鍵字定義唯讀變數，定義後其值無法修改val a: Int = 1 // 定義a為`Int`型別的唯讀變數，其值為1val b = 2 // 自動檢測b為`Int`型別使用codice_4關鍵字定義可變變數。var x = 5 // App 定義一個`Int`，值為5x = 1 // 修改值為1函式.使用codice_8關鍵字定義一個函式。fun sum(a: Int, b: Int): Int {return a + b上例定義了一個傳入兩個Int變數，並返回兩數之和的求和函式。程式的入口點.類似於 C、 C++、 C#、 Java 和 Go ， Kotlin 程式的入口點是一個名為“main”的函式。 main 函式有一個包含命令列選項的引數。 Kotlin 支援像 Perl 和 Unix shell 那樣的。 型別推斷也是支援的。// Hello, world! 範例fun main() {val scope = "World"println("Hello, $scope!")fun main(args: Array) {for (arg in args) {println(arg)函式擴充套件.Kotlin與C#、JavaScript類似，能夠擴充套件類別的新功能，而無需繼承該類別，或使用像裝飾器。擴充套件函式可以稱為Kotlin的核心，在標準庫裡到處充斥著擴充套件函式。擴充套件函式是靜態分發的，也就是說，它們不是以接收者型別為準的虛擬函式。這意味著呼叫的擴充套件函式是由函式呼叫所在的表示式的型別來決定的，而不是由表示式執行時求值結果決定的。在下述例子中，String類別被擴展出一個成員lastChar。package MyStringExtensionsfun String.lastChar(): Char = get(length - 1)»&gt; println("Kotlin".lastChar())利用函式擴充套件，Kotlin也支援運算子過載：// overloading '+' operator using an extension methodoperator fun Point.plus(other: Point): Point {return Point(x + other.x, y + other.y)»&gt; val p1 = Point(10, 20)»&gt; val p2 = Point(30, 40)»&gt; println(p1 + p2)Point(x=40, y=60)getter和setter.Kotlin像C#一樣支援屬性。解包引數.類似Python, 解包:fun main(args: Array) {val list = listOf("args: ", *args)println(list)函式巢狀.Kotlin支援函式巢狀，允許函式內再定義函式，類似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 (value.isBlank()) {throw IllegalArgumentException("Can't save user ${user.id}: empty $fieldName")validate(user, user.name, "Name")validate(user, user.address, "Address")// Save user to the database解構宣告.Kotlin支援解構宣告，這與Python的迭代解包相似。例如, collection object 包含解構式可分離其元素:for ((index, element) in collection.withIndex()) {println("$index: $element")抽象類別.抽象類別佔位函式，需要被繼承。抽象類別預設是open的。// No need for the open keyword here, its already open by defaultabstract class Animated {// This virtual function is already open by default as wellabstract fun animate()類別屬性.Kotlin 提供下列的關鍵字來限制頂層。它們可用於類別及其成員:publicinternalprotectedprivate用於類別的成員宣告時，含義如下：用於頂層宣告時，含義如下：例如:// Class is visible only to current moduleinternal open class TalkativeButton : Focusable {// method is only visible to current classprivate fun yell() = println("Hey!")// method is visible to current class and derived classesprotected fun whisper() = println("Let's talk!")主建構函式 vs. 二級建構函式.在Kotlin 中類別可以有一個主建構函式以及多個二級建構函式。如果主建構函式沒有註解或可見性說明，則codice_9關鍵字可以省略。如果建構函式中沒有其它操作，大括號也可以省略。// 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 #1constructor(ctx: Context) : super(ctx) {}// Constructor #2constructor(ctx: Context, attr: AttributeSet) : super(ctx, attr) {Anko library.Anko 是一組為Kotlin 打造的函式庫，其功能是用來開發Android UI 應用程式，現已棄用。fun Activity.showAreYouSureAlert(process: () -&gt; Unit) {alert(title = "Are you sure?",message = "Are you really sure?")Kotlin 互動模式.Kotlin除了編譯成Java位元組碼執行，也可以作為指令碼語言解釋執行，此特性使得Kotlin可以以互動模式執行。互動模式是指令碼語言具有的特性，直譯器可以立即執行使用者輸入的程式碼，並反饋執行結果。典型的語言有Python、JavaScript、Ruby。$ kotlinc-jvmtype :help for help; :quit for quit»&gt; 2+24»&gt; println("Welcome to the Kotlin Shell")Welcome to the Kotlin ShellKotlin 也是指令碼語言.Kotlin 亦可視為指令碼語言。其指令碼存成 Kotlin source file (.kts)，即成為可執行檔。// list_folders.ktsimport java.io.File為了執行Kotlin 指令碼，我們在執行編譯器時再加上#重定向 選項。$ kotlinc -script list_folders.kts "path_to_folder_to_inspect"Kotlin 的 hello world 例子.fun main(args: Array) {greet {to.place}.print()//inline higher-order functionsinline fun greet(s: () -&gt; String) : String = greeting andAnother s()//infix functions, extensions, type inference, nullable types, lambda expressions, labeled this, elvis operatorinfix fun String.andAnother(other : Any?) = buildString() { append(this@andAnother); append(" "); append(other ?: "") }//immutable types, delegated properties, lazy initialization, string templates//sealed classes, companion objects//extensions, Unitfun String.print() = println(this)空變數及其運算.Kotlin對可以為空必須在定義時加上 "?" 後置於型別之後。開發人員遇到nullable objects時要先確認: null-check 須被執行過，才能賦值。可空性是Kotlin型別系統中幫助開發者避免以往Java的NullPointerException錯誤的特性。Kotlin 提供空安全運算子給開發人員:fun sayHello(maybe: String?, neverNull: Int) {// use of elvis operatorval name: String = maybe ?: "stranger"println("Hello $name")使用安全導引運算子:// returns null if...// - foo() returns null,// - or if foo() is non-null, but bar() returns null,// - or if foo() and bar() are non-null, but baz() returns null.// vice versa, return value is non-null if and only if foo(), bar() and baz() are non-nullfoo()?.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) -&gt; Unit indicates a lambda with a String parameter and Unit return typefun executeLambda(f: (s: String) -&gt; Unit) {f("lambda")Lambdas 可用大括弧#重定向 來定義。如果lambda 夾帶引數，他們可定義在大括弧內，並以#重定向 運算子區隔。// the following statement defines a lambda that takes a single parameter and passes it to the println function