1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//variables and constants var currentVersionCode = 1 //變量當前的版本號,類型Int能夠根據值推斷出來 var currentVersionName : String = "1.0" //顯式標明類型 val APPNAME = "droidyue.com" //常量APPNAME 類型(String)能夠根據值推斷出來 //methods fun main(args: Array<String>) { println(args) } // class class MainActivity : AppCompatActivity() { } // data class 自動生成getter,setting,hashcode和equals等方法 data class Book(var name: String, val price: Float, var author: String) //支持默認參數值,減小方法重載 fun Context.showToast(message: String, duration:Int = Toast.LENGTH_LONG) { Toast.makeText(this, message, duration).show() } |
var
表示變量,val
表示常量更加的簡潔空指針(NullPointerException或NPE)是咱們使用Java開發程序中最多見的崩潰了。由於在Java中咱們不得不寫不少防護性的代碼,好比這樣html
1
2 3 4 5 6 7 8 |
public void test(String string) { if (string != null) { char[] chars = string.toCharArray(); if (chars.length > 10) { System.out.println(((Character)chars[10]).hashCode()); } } } |
在Kotlin中空指針異常獲得了很好的解決。java
以下面的代碼就是Kotlin實現空指針安全的一個例子,並且相對Java實現而言,簡直是一行代碼搞定的。android
1
2 3 4 5 6 7 8 9 10 11 12 |
fun testNullSafeOperator(string: String?) { System.out.println(string?.toCharArray()?.getOrNull(10)?.hashCode()) } testNullSafeOperator(null) testNullSafeOperator("12345678901") testNullSafeOperator("123") //result null 49 null |
關於空指針安全的原理,能夠參考這篇文章研究學習Kotlin的一些方法編程
不少時候,Framework提供給咱們的API每每都時比較原子的,調用時須要咱們進行組合處理,由於就會產生了一些Util類,一個簡單的例子,咱們想要更快捷的展現Toast信息,在Java中咱們能夠這樣作。數組
1
2 3 |
public static void longToast(Context context, String message) { Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } |
可是Kotlin的實現卻讓人驚奇,咱們只須要重寫擴展方法就能夠了,好比這個longToast方法擴展到全部的Context對象中,若是不去追根溯源,可能沒法區分是Framework提供的仍是自行擴展的。安全
1
2 3 4 |
fun Context.longToast(message: String) { Toast.makeText(this, message, Toast.LENGTH_LONG).show() } applicationContext.longToast("hello world") |
注意:Kotlin的方法擴展並非真正修改了對應的類文件,而是在編譯器和IDE方面作得處理。使咱們看起來像是擴展了方法。app
所謂的Lambda表達式是匿名函數,這使得咱們的代碼會更加的簡單。好比下面的代碼就是lambda的應用。框架
1
2 3 |
findViewById(R.id.content).setOnClickListener { Log.d("MainActivity", "$it was clicked") } |
所謂的高階函數就是編程語言
舉一個接受函數做爲參數的例子。在Android開發中,咱們常用SharedPreference來存儲數據,若是忘記調用apply或者commit則數據修改不能應用。利用Kotlin中的高階函數的功能,咱們能更好的解決這個問題函數式編程
1
2 3 4 5 6 7 8 9 10 |
fun SharedPreferences.editor(f: (SharedPreferences.Editor) -> Unit) { val editor = edit() f(editor) editor.apply() } //實際調用 PreferenceManager.getDefaultSharedPreferences(this).editor { it.putBoolean("installed", true) } |
固然這上面的例子中咱們也同時使用了方法擴展這個特性。
Kotlin支持了Streams API和方法引用,這樣函數式編程更加方便。好比下面的代碼就是咱們結合Jsoup,來抓取某個proxy網站的數據,代碼更加簡單,實現起來也快速。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
fun parse(url: String): Unit { Jsoup.parse(URL(url), PARSE_URL_TIMEOUT).getElementsByClass("table table-sm") .first().children() .filter { "tbody".equals(it.tagName().toLowerCase()) } .flatMap(Element::children).forEach { trElement -> ProxyItem().apply { trElement.children().forEachIndexed { index, element -> when (index) { 0 -> { host = element.text().split(":")[0] port = element.text().split(":")[1].toInt() } 1 -> protocol = element.text() 5 -> country = element.text() } } }.let(::println) } } |
不管是Java仍是Android開發,咱們都會用到字符串拼接,好比進行日誌輸出等等。在Kotlin中,字符串模板是支持的,咱們能夠很輕鬆的完成一個字符串數組的組成
1
2 3 |
val book = Book("Thinking In Java", 59.0f, "Unknown") val extraValue = "extra" Log.d("MainActivity", "book.name = ${book.name}; book.price=${book.price};extraValue=$extraValue") |
注意:關於字符串拼接能夠參考這篇文章Java細節:字符串的拼接
Kotlin和Java都屬於基於JVM的編程語言。Kotlin和Java的交互性很好,能夠說是無縫鏈接。這表如今
Kotlin對Android應用開發支持普遍,諸多工具,好比kotterknife(ButterKnife Kotlin版),RxKotlin,Anko等等,固然還有已經存在的不少Java的庫都是可使用的。
除此以外,Kotlin也能夠編譯成Javascript。最近使用Kotlin寫了一段抓取proxy的代碼,實現起來很是快捷。甚至比純JavaScript實現起來要快不少。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
fun handle(): Unit { window.onload = { document.getElementsByClassName("table table-sm").asList().first() .children.asList().filter { "TBODY".equals(it.tagName.toUpperCase()) } .flatMap { it.children.asList() }.forEach { var proxyItem = ProxyItem() it.children.asList().forEachIndexed { index, element -> when (index) { 0 -> { proxyItem.host = element.trimedTextContent()?.split(":")?.get(0) ?: "" proxyItem.port = element.trimedTextContent()?.split(":")?.get(1)?.trim()?.toInt() ?: -1 } 1 -> proxyItem.protocol = element.trimedTextContent() ?: "" 5 -> proxyItem.country = element.trimedTextContent() ?: "" } }.run { console.info("proxyItem $proxyItem") } } } } |
Kotlin的執行效率和Java代碼的執行效率理論上一致的。有時候Kotlin可能會顯得高一些,好比Kotlin提供了方法的inline設置,能夠設置某些高頻方法進行inline操做,減小了運行時的進棧出棧和保存狀態的開銷。
Kotlin的有不少特色,好比簡潔,安全實用,開發效率高和提高可讀性,更好的函數式編程支持。
1.簡潔,Kotlin的代碼確實比Java更加簡潔,好比類型推斷,省去結尾的分號等等,然而這遠不能成爲咱們改用Kotlin的緣由。
2.安全,這是Kotlin的一個很重要的特性。Kotlin是空指針安全的,JetBrains作了一件很聰明的事情,它們將運行時才能空指針的檢測提早到了編譯時,主要方式是增長了Any?這種可爲空的類型,使用Kotlin以後,咱們程序的空指針會獲得明顯的改善。
3.實用,高效率。Kotlin的實用具體表如今
4.Kotlin引入了Lambda,Streams API 和函數式編程支持。
5.可讀性 從客觀上,Kotlin語法和特性上讓代碼更加具備描述性而已。可是不得不指出代碼可讀性主要依賴編寫者的編碼素質和能力。
對我我的而言,高階函數和方法擴展這兩個特色着實真心受用。方法擴展會讓我有一種創造感,這是Java種的Util方法所沒法比擬的。
有了Google的支持,Kotlin轉Android相信在不久的未來就會全面展開。篡改Python的一句名言「人生苦短,我用Kotlin」,這樣一個高效實用的語言應該會被愈來愈多的團隊所接受,並應用到開發生產中。固然也但願在國內環境下大放異彩。
refs:
http://droidyue.com/blog/2017/05/18/why-do-i-turn-to-kotlin/http://droidyue.com/blog/2017/05/21/my-opinion-of-kotlins-becoming-an-official-language-of-android/