Kotlin:Android世界的Swift

Kotlin是一門與Swift相似的靜態類型JVM語言,由JetBrains設計開發並開源。與Java相比,Kotlin的語法更簡潔、更具表達性,並且提供了更多的特性,好比,高階函數、操做符重載、字符串模板。它與Java高度可互操做,能夠同時用在一個項目中。html

按照JetBrains的說法,根據他們多年的Java平臺開發經驗,他們認爲Java編程語言有必定的侷限性和問題,並且因爲須要向後兼容,它們不可能或很可貴到解決。所以,他們建立了Kotlin項目,主要目標是:git

  • 建立一種兼容Java的語言
  • 編譯速度至少同Java同樣快
  • 比Java更安全
  • 比Java更簡潔
  • 比最成熟的競爭者Scala還簡單

Ashraff Hathibelagal是一名喜歡研究新框架和SDK的獨立開發者。近日,他撰文介紹了Kotlin的一些語法。按照他的說法,一個合格的Java程序員能夠在很短的時間內學會使用Kotlin。程序員

類與構造函數github

Kotlin建立類的方式與Java相似,好比下面的代碼建立了一個有三個屬性的Person類:編程

class Person{
    var name: String = ""
    var age: Int = 0
    var college: String? = null
}

能夠看到,Kotlin的變量聲明方式略有些不一樣。在Kotline中,聲明變量必須使用關鍵字var,而若是要建立一個只讀/只賦值一次的變量,則須要使用val代替它。另外,爲了實現「空安全(null safety)」,Kotlin對能夠爲空的變量和不能夠爲空的變量做了區分。在上述代碼中,變量nameage不可爲空,而代表變量college能夠爲空。定義完類以後,建立實例就很是簡單了:數組

var jake = Person()

注意,Kotlin沒有關鍵字new。實例建立完成後,就能夠像在Java中同樣爲變量賦值了:安全

jake.name = "Jake Hill"
jake.age = 24
jake.college = "Stephen's College"

變量能夠採用上述方式賦值,也能夠經過構造函數賦值,但後者是一種更好的編碼實踐。在Kotlin中,建立這樣的一個構造函數很是簡單:數據結構

class Person(var name: String, var age: Int, var college: String?) {
}

而實際上,因爲構造函數中沒有其它操做,因此花括號也能夠省略,代碼變得至關簡潔:框架

class Person(var name: String, var age: Int, var college: String?)

var jake = Person("Jake Hill", 24, "Stephen's College")

上述代碼中的構造函數是類頭的一部分,稱爲主構造函數。在Kotlin中,還可使用constructor關鍵字建立輔助構造函數,例如,下面的代碼增長了一個輔助構造函數初始化變量email編程語言

class Person(var name: String, var age: Int, var college: String?) {

    var email: String = ""

    constructor(name:String, age:Int, college: String?, email: String) : this(name, age, college) {
        this.email = email
    }
}

Kotlin容許建立派生類,但要遵循以下規則:

  • 必須使用代替Java中的extends關鍵字
  • 基類頭必須有open註解
  • 基類必須有一個帶參數的構造函數,派生類要在它本身的頭中初始化那些參數

好比下面的代碼建立了一個名爲Empoyee的派生類:

open class Person(var name: String, var age: Int, var college: String?) {
    ...
}

class Employee(name: String, age: Int, college: String?, var company: String) : Person(name, age, college) {
}

函數與擴展

有派生就有重載。與類的派生同樣,容許重載的方法要有open註解,而在派生類中重載時要使用override註解。例如,下面是在Employee類中重載Person類的isEligibleToVote方法的代碼:

override fun isEligibleToVote(): Boolean {
    return true
}

除了改變類的已有行爲,Kotlin還容許開發者在不修改類的原始定義的狀況下實現對類的擴展,以下面的代碼爲Person類增長了一個名爲isTeenager的擴展:

fun Person.isTeenager(): Boolean {
    return age in 13..19
}

在須要擴展來自其它項目的類時,這個特性特別有用。

上面提到的函數都與Java中的函數相似,但Kotlin還支持其它類型的函數。若是一個函數返回單個表達式的值,那麼可使用=來定義函數。下面是一個建立單表達式函數的例子:

fun isOctogenarian(): Boolean = age in 80 .. 89

Kotlin還支持高階函數和Lambda表達式。例如,lambda表達式{x,y->x+y}能夠像下面這樣給一個變量賦值:

val sumLambda: (Int, Int) -> Int = {x,y -> x+y}

而下面的高階函數將上述表達式做爲一個參數,並將表達式的計算結果翻倍:

fun doubleTheResult(x:Int, y:Int, f:(Int, Int)->Int): Int {
    return f(x,y) * 2
}

該函數可使用下面的其中一種方式調用:

val result1 = doubleTheResult(3, 4, sumLambda)

val result2 = doubleTheResult(3, 4, {x,y -> x+y})

範圍表達式

在Kotlin中,範圍表達式用的比較多。範圍建立只須要..操做符,例如:

val r1 = 1..5
//該範圍包含數值1,2,3,4,5

若是建立一個降序範圍,則須要使用downTo函數,例如:

val r2 = 5 downTo 1
//該範圍包含數值5,4,3,2,1

若是步長不是1,則須要使用step函數,例如:

val r3 = 5 downTo 1 step 2
//該範圍包含數值5,3,1

條件結構

在Kotlin中,if是一個表達式,根據條件是否知足返回不一樣的值,例如,下面的代碼將isEligibleToVote設置爲「Yes」

var age = 20
val isEligibleToVote = if(age > 18) "Yes" else "No"

when表達式至關於Java的switch,但功能更強大,例如,下面的代碼將typeOfPerson設置爲「Teenager」:

val age = 17

val typeOfPerson = when(age){
    0 -> "New born"
    in 1..12 -> "Child"
    in 13..19 -> "Teenager"
    else -> "Adult"
}

循環結構

Kotlin使用for..in遍歷數組、集合及其它提供了迭代器的數據結構,語法同Java幾乎徹底相同,只是用in操做符取代了:操做符,例如,下面的代碼將遍歷一個String對象數組:

val names = arrayOf("Jake", "Jill", "Ashley", "Bill")

for (name in names) {
    println(name)
}

whiledo..while循環的語法與Java徹底相同。

字符串模板

Kotlin容許在字符串中嵌入變量和表達式,例如:

val name = "Bob"
println("My name is ${name}") //打印"My name is Bob"

val a = 10
val b = 20
println("The sum is ${a+b}") //打印"The sum is 30"

此外,Kotlin與Java高度可互操做。Kotlin能夠用一種天然的方式調用現有的Java代碼,而Java也很容易調用Kotlin代碼。同時,Kotlin也能夠與JavaScript互操做。

上面介紹的只是Kotlin的一些基本語法和特性,更多細節請查閱官方文檔。事實上,到目前爲止,Kotlin還仍然只是一個預覽版本,接下來的幾個月中還會有多項重大改進及新增特性。儘管如此,GitHub上已有400多個與Kotlin項目相關的庫

相關文章
相關標籤/搜索