本文由 Prefert 發表在 ScalaCool 團隊博客。android
在今年的 Google I/O 大會上,Google 宣佈在 Android 上爲 Kotlin 提供一等支持(轉爲正房)。git
在 Andorid 開發的圈子中,這無疑掀起了軒然大浪。對部分人來講,也許這是第一次聽到 Kotlin 。事實上,在 2011 年 7 月,JetBrains 就推出 Kotlin 項目,直到去年 2 月 Kotlin v1.0 才正式發佈。程序員
本系列文章「Dive Into Kotlin」將會對 Kotlin 進行較爲系統的介紹,大體分爲四個章節:github
1. 熱身 —— Kotlin 基本特性
2. 下水 —— Kotlin 與函數式
3. 潛入 —— Kotlin 核心
4. 遨遊 —— kotlin 與 Android 實戰編程
本文將簡單介紹 Kotlin 的生態和部分語言功能,目錄以下:安全
Kotlin 是一種在 JVM 上運行的靜態類型編程語言,能夠編譯成 Java 字節碼,也能夠編譯成 JavaScript,方便在沒有 JVM 的設備上運行。框架
簡約:幫你減小實現同一個功能的代碼量。編程語言
易懂:讓你的代碼更容易閱讀,同時易於理解。ide
安全:移除了你可能會犯錯誤的功能。函數式編程
通用:基於 JVM 和 JavaScript,你能夠在不少地方運行。
互操做性: Kotlin 和 Java 能夠相互調用,同時 Jetbrains 的目標是讓他們 100% 兼容。
對比 Java,Kotlin 或許顯得有點年輕,但這並不表明它的生態圈不夠穩定。
Kotlin 編譯爲 JVM 字節碼或 JavaScript
它能夠吸引全部使用垃圾回收機制語言的程序員,包括 Java,Scala,Go,Python, Ruby 和 JavaScript。
kotlin 產自工業,而不是學術界。
它解決了程序員目前所面臨的一些問題。舉個例子:類型系統能夠幫助你避免空指針異常。當咱們在使用一些 API 或者大型庫時判斷是否爲 null,每每沒有什麼實際做用。
Kotlin 完美兼容 Java
在 Idea 中,你能夠一鍵實現 Java 與 Kotlin 的轉換。也就是說, Kotlin 寫的項目中可使用全部現有的 Java 框架和庫,甚至是依賴於註解的高級框架,而且它整合了 Maven,Gradle 和其餘構建工具——幫助咱們實現無縫的互操做。
Kotlin 相對入門簡單
因此正如你們所說的那樣,Kotlin 是一門十分友好的語言,你甚至能夠花幾個小時閱讀下相關書籍就能入門。它的語法簡潔直觀,也許大多時候看起來比較像 Scala,實際上簡單了不少。這種語言很好地平衡了簡潔和可讀性。
不施加運行時間的開銷
標準庫是比較小的:主要是對 Java 標準庫的重點擴展。大量使用編譯時內聯(compile-time inlining)就意味着像 map
、 filter
、 reduce
這樣的語法編譯起來與命令式的類似。
Android擴展庫
Anko 與 kovenant 讓 Kotlin 在 Android 的開發中更加方便,若是你看過這兩個庫,必定也爲之青睞。
除 Android 外,其實企業級別的 Java 項目也能夠考慮使用 Kotlin:
它有一個成熟的公司強大的商業支持,JetBrains 致力於該項目的發展,擁有一支高效的團隊和穩定的商業模式。在較長的時間內,你都不用擔憂 Kotlin 被拋棄。
Kotlin 的風險很低:能夠由一兩個成員嘗試在某個功能塊使用,但並不會影響其餘模塊:Kotlin 類能夠導出一個與常規 Java 代碼看起來相同的 Java API。
Java 6 廢土中的一線但願:若是升級 JVM 對於大家的成本很高,你可使用 Kotlin,它是「增強版的 Java 6」。
看完生態圈,來看看最吸引咱們的語言功能部分。
Java Bean 中老是出現一些重複工做量的代碼:
public class Customer{
String name;
int age;
public Customer(String name, int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public setName(String name){
this.name=name;
}
public setAge(int age){
this.age=age;
}
}
複製代碼
在 Java 對象中,構造函數和屬性的 Getter
、Setter
函數在每一個Bean類中都會出現,看起來很是冗餘。
可是使用 Kotlin,代碼是這樣的:
data class Customer(val name:String, val age:Int)
複製代碼
Kotlin 將Getter
、Setter
等函數省略,讓咱們更加關注屬性。
若是你是一名 「FP」 (Functional Programming) 愛好者,你確定知道 Scala 這門語言。而 Kotlin 的設計初衷就是提供 Scala 裏的不少特性,但不被編譯時間束縛。
網上對函數式編程的介紹,大多數對初學者都是不夠友好的,下面是一種比較簡潔的歸納:
函數編程以基於數學的函數構成,實現一個功能時傾向於實現的目標,而不是實現目標的方式。
也就是說,函數式編程處理的是不可變的數據,即不會改變變量的值。它所作的只是 Receive(接收)-> Compute(計算)-> Return(返回) ,而不改變它接收到的值,或者引發「反作用」。
// Java
void check(boolean isAlpha, boolean isNum){
// do something
}
check(true, false); // 函數調用
// Kotlin
fun check(isAlpha:Boolean, isNum:Boolean = false) {
// do something
}
check(true)// 1
check(true,true)// 2
check(isAlpha = true, isNum = false) // 3
check(isNum = false, isAlpha = true) // 4
複製代碼
其中一、三、4實際效果一致。
// Java
int sum (int x, int y){ // 必須聲明返回類型
x = x + y; // x的值被改變,帶來反作用
return x;
}
// kotlin
fun sum(x: Int, y: Int) = x + y // 完美
複製代碼
在 Android 開發時,咱們應該都會對視圖的 onClick
事件感到煩躁。
// Java
view.setOnClickListener(new View.OnClickKistener() {
@ Override public void onClick(View v){
System.out.println("sad");
}
});
複製代碼
在 kotlin 中,這也獲得簡化:
view.onClick {
println("nice !!")
}
複製代碼
在 Android 開發中,出現 NullPointerException
已經能夠說是屢見不鮮了。但若是在運行的時候出現這個異常致使程序崩潰,對用戶體驗形成的損失是巨大的。
Kotlin 能很好的避免這個問題:
// Java
String text1 = null // NE
// Kotlin
var text1: String = "Kotlin"// 正常
var text2: String = null // NE
var text3: String ?= null // 正常
複製代碼
Kotlin 中只有加了 ?
才容許爲 null。
?
確保安全調用:// Java
if(a != null){
int x = a.length();
}
// Kotlin
val x = a?.length // 僅當 a 不爲 null 時才能經過編譯
複製代碼
val x = b?.length ?: 0 // 若是 b 爲 null,那他的 length 就爲0
val x = b?.length ?: throw NullPointerException()
val x = b!!.length
複製代碼
Lambda 表達式增長了 Kotlin 的簡潔功能,從而也讓代碼更容易理解。(Java 6 不支持 lambda )
val sum = {x: Int, y: Int -> x + y} // 類型:(Int, Int) -> Int
val result = sum(2, 7)// result == 9
複製代碼
kotlin 中 when
一樣能帶給你驚喜,你能夠用它簡化 if..else
或 switch
:
// Java
if(x == 1) println("x is 1");
else if(x == 2) println("x is 2");
else if(x == 3 || x == 4) println("x is 3 or 4");
else if(x >= 5 || x <= 10) println("x is 5, 6, 7, 8, 9, or 10");
else println("x is out of range");
// Kotlin
when (x) {
1 -> print("x is 1")
2 -> print("x is 2")
3, 4 -> print("x is 3 or 4")
in 5..10 -> print("x is 5, 6, 7, 8, 9, or 10")
else -> print("x is out of range")
}
複製代碼
固然除了以上這些,Kotlin 還有許多使人驚喜的特性,將會在後續的文章中詳細介紹,敬請期待。