什么是kotlin?
Kotlin 是一個用于現代多平臺應用的靜態編程語言 [1],由JetBrains開發。
Kotlin可以編譯成Java字節碼,也可以編譯成JavaScript,方便在沒有JVM的設備上運行。
Kotlin已正式成為Android官方支持開發語言。
100%兼容Java
Kotlin-Js前端開發
Kotlin-Jvm服務端開發
Kotlin-Native 本地執行程序
Kotlin發展歷程
2010 立項
2011.6 對外公開
2012.2 開源
2013.8 支持Android Studio
2014.6 全新開源web站點和域名Kotlinlang.org
2016.2 發布1.0
2016.9 發布1.0.4 支持apt
官方文檔https://kotlinlang.org/docs/reference
Kotlin源碼https://github.com/JetBrains/kotlin
Kotlin官博https://blog.jetbrains.com/kotlin/
微信公眾號 Kotlin
Gradle文檔
https://docs.gradle.org/current/userguide/userguide.html
使用Kotlin進行Android開發
Kotlin非常適合開發Android應用程序,將現代語言的所有優勢帶入Android平臺,而不會引入任何新的限制:
兼容性:Kotlin與JDK 6完全兼容,確保Kotlin應用程序可以在較舊的Android設備上運行而不會出現問題。Android Studio完全支持Kotlin工具,并與Android構建系統兼容。
性能:由于非常相似的字節碼結構,Kotlin應用程序的運行速度與等效的Java應用程序一樣快。由于Kotlin支持內聯函數,使用lambda的代碼通常比使用Java編寫的相同代碼運行得更快。
互操作性:Kotlin與Java 100%互操作,允許在Kotlin應用程序中使用所有現有的Android庫。這包括注釋處理,因此數據綁定和Dagger也可以工作。
足跡:Kotlin有一個非常緊湊的運行時庫,可以通過使用ProGuard進一步減少。在實際應用程序中,Kotlin運行時只添加幾百個方法,小于.apk文件大小的100K。
編譯時間:Kotlin支持高效的增量編譯,因此雖然對于干凈的構建有一些額外的開銷,但增量構建通常比使用Java快或快。
學習曲線:對于Java開發人員來說,使用Kotlin非常容易。Kotlin插件中包含的自動Java to Kotlin轉換器有助于完成第一步。Kotlin Koans通過一系列互動練習提供語言主要功能的指南。
Kotlin for Android案例研究
Kotlin已成功被大公司采用,其中一些公司已經分享了他們的經驗:
Pinterest已成功將Kotlin引入其應用程序,每月由1.5億人使用。
Basecamp的Android應用程序是100%Kotlin代碼,他們報告程序員的快樂和工作質量和速度的巨大改進的巨大差異。
Keepsafe的App Lock應用程序也已轉換為100%Kotlin,導致源代碼數減少30%,方法數減少10%。
Android開發工具
Kotlin團隊為Android開發提供了一套超越標準語言功能的工具:
Kotlin Android Extensions是一個編譯器擴展,允許您擺脫findViewById()代碼中的調用,并用合成編譯器生成的屬性替換它們。
Anko是一個庫,提供圍繞Android API的一組Kotlin友好包裝器,以及一個允許您使用Kotlin代碼替換布局.xml文件的DSL。
kotlin的小特點
kotlin支持類型推斷
var表示變量? val表示常量
fun表示方法
類的繼承和實現使用? ? :
kotlin的每個句子不需要 加分號 ;
空指針安全? 空指針(nullpointerexception或NPE)是我們使用Java最常見的崩潰,所以我們在Java中會寫許多防御性的代碼:
在kotlin中空指針的解決
在類型處理上,在類型的后面加上? ?? 表示這個變量參數賦值為null或者返回null
對于一個可能是null的變量或者參數,在調用對象方法或者屬性之前,需要加上? ?,否則編譯沒有辦法通過,如圖。關于空指針安全的原理,可以參考這篇文章研究學習Kotlin的一些方法。
支持方法的擴展
很多時候,framework提供給我們的API往往都是比較原子的,調用的適合需要進行組合處理,因為會產生一些util類,一個簡單的例子,我們想要更快的去展示一個toast信息,在Java中
在kotlin中我們只需要重寫擴展方法就可以了,
注意:kotlin的方法擴展并不是真正修改了對應的類文件,而是在編譯器和IDE方面做了處理,使我們看起來更像是擴展方法。
Lambda,高階函數,Streams API,函數式編程支持
所謂的lambda表達式是匿名函數,這使得我們的代碼會更加簡單,
高階函數通俗的講就是可以接受函數作為參數,也可以返回函數作為結果
舉一個接受函數作為參數的例子,在Android開發中,我們經常的使用sharedpreference來存儲數據,如果忘記調用apply或者commit則數據修改是不能應用,利用kotlin中的高階函數的功能可以解決這個問題。同時也使用了方法擴展這個特性。
kotlin支持streams API和方法的引用,使函數式編程更加的方便,下圖就是結合jsoup,來抓取某個proxy網站的數據,代碼更加簡單,實現起來也快速。
字符串模板
無論是 Java 還是 Android 開發,我們都會用到字符串拼接,比如進行日志輸出等等。在 Kotlin 中,字符串模板是支持的,我們可以很輕松的完成一個字符串數組的組成。
注意:關于字符串拼接可以參考這篇文章Java細節:字符串的拼接。
與 Java 交互性好
Kotlin 和 Java 都屬于基于 JVM 的編程語言。Kotlin 和 Java 的交互性很好,可以說是無縫連接。
這表現在:
Kotlin 可以自由的引用 Java 的代碼,反之亦然。
Kotlin 可以現有的全部的 Java 框架和庫
Java 文件可以很輕松的借助 IntelliJ 的插件轉成 kotlin
Kotlin 應用廣泛? Kotlin 對 Android 應用開發支持廣泛,諸多工具,比如 kotterknife(ButterKnife Kotlin 版),RxKotlin,Anko 等等,當然還有已經存在的很多 Java 的庫都是可以使用的。
除此之外,Kotlin 也可以編譯成 Java。最近使用 Kotlin 寫了一段抓取 proxy 的代碼,實現起來非常快捷。甚至比純 Java 實現起來要快很多。
相比Java 7的優勢到底是什么呢?
它更加易表現:這是它最重要的優點之一。你可以編寫少得多的代碼。
它更加安全:Kotlin是空安全的,也就是說在我們編譯時期就處理了各種null的情況,避免了執行時異常。如果一個對象可以是null,則我們需要明確地指定它,然后在使用它之前檢查它是否是null。你可以節約很多調試空指針異常的時間,解決掉null引發的bug。
它是函數式的:Kotlin是基于面向對象的語言。但是就如其他很多現代的語言那樣,它使用了很多函數式編程的概念,比如,使用lambda表達式來更方便地解決問題。其中一個很棒的特性就是Collections的處理方式。
它可以擴展函數:這意味著我們可以擴展類的更多的特性,甚至我們沒有權限去訪問這個類中的代碼
它是高度互操作性的:你可以繼續使用所有的你用Java寫的代碼和庫,因為兩個語言之間的互操作性是完美的。甚至可以在一個項目中使用Kotlin和Java兩種語言混合編程。
關于性能
Kotlin 的執行效率和 Java 代碼的執行效率理論上一致的。有時候 Kotlin 可能會顯得高一些,比如 Kotlin 提供了方法的 inline 設置,可以設置某些高頻方法進行 inline 操作,減少了運行時的進棧出棧和保存狀態的開銷。
關于轉向 Kotlin
其實,我在做決定之前也曾有過考慮,是不是選擇了 Kotlin 就意味著放棄 Java 呢,冷靜下來想一想,其實并不是那么回事,因為 Kotlin 與 Java 語法太相近,以及在 Kotlin 中無時無刻不在和 Java 相關的東西打交道,所以這點顧慮不是問題的。
對于個人的項目來轉向 Kotlin,通常不是很難的選擇,畢竟 Kotlin 是那么優秀的語言,相信很多人還是愿意嘗試并使用這個事半功倍的語言的。
而比較難抉擇的情況是如果如何讓團隊轉用 Kotlin,個人認為團隊難以轉用的原因有很多,比如學習成本,歷史包袱等等。但其實根本原因還是思維方式的問題,歪果仁喜歡用工具來提升開發效率,因為人力成本很高。而國內團隊提高效率的辦法通常是增加成員。好在 Flipboard 美國團隊自 2015 年(可能更早)就引入了 Kotlin,因此中國團隊這邊選用 Kotlin 也更加順水推舟。當然更主要的是目前團隊規模不大,成員一致認可 Kotlin 的優點。
關于團隊轉用 Kotlin 的方法,一般比較行得通的辦法是自上而下的推行。這就意味著要么直接的技術負責人比較開明要么就是需要有人來不斷推介來影響團隊。
現在好了,有了 Google 的支持,Kotlin 轉 Android 相信在不久的將來就會全面展開。篡改 Python 的一句名言「人生苦短,我用 Kotlin」,這樣一個高效實用的語言應該會被越來越多的團隊所接受,并應用到開發生產中。當然也希望在國內環境下大放異彩。