Kotlin入門簡介

Kotlin的「簡歷」

  • 來自於著名的IDE IntelliJ IDEA(Android Studio基於此開發) 軟件開發公司 JetBrains(位於東歐捷克)
  • 起源來自JetBrains的聖彼得堡團隊,名稱取自聖彼得堡附近的一個小島(Kotlin Island)
  • 一種基於JVM的靜態類型編程語言

語法簡單,不囉嗦

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() } 
  • Kotlin支持類型推斷,沒有Java那樣的囉嗦。
  • 另外用var表示變量,val表示常量更加的簡潔
  • 方法也很簡單,連function都縮寫成了fun,平添了幾分雙關之意。
  • 類的繼承和實現很簡單,使用:便可
  • Kotlin每一個句子都不須要加分號(;)

空指針安全

空指針(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

  • 在類型上的處理,即在類型後面加上?,即表示這個變量或參數以及返回值能夠爲null,不然不容許爲變量參數賦值爲null或者返回null
  • 對於一個多是null的變量或者參數,在調用對象方法或者屬性以前,須要加上?,不然編譯沒法經過。

以下面的代碼就是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, 高階函數,Streams API, 函數式編程支持

所謂的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細節:字符串的拼接

與Java交互性好

Kotlin和Java都屬於基於JVM的編程語言。Kotlin和Java的交互性很好,能夠說是無縫鏈接。這表如今

  • Kotlin能夠自由的引用Java的代碼,反之亦然。
  • Kotlin能夠現有的所有的Java框架和庫
  • Java文件能夠很輕鬆的藉助IntelliJ的插件轉成kotlin

 

Kotlin應用普遍

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的魅力究竟在哪裏

Kotlin的有不少特色,好比簡潔,安全實用,開發效率高和提高可讀性,更好的函數式編程支持。

1.簡潔,Kotlin的代碼確實比Java更加簡潔,好比類型推斷,省去結尾的分號等等,然而這遠不能成爲咱們改用Kotlin的緣由。

2.安全,這是Kotlin的一個很重要的特性。Kotlin是空指針安全的,JetBrains作了一件很聰明的事情,它們將運行時才能空指針的檢測提早到了編譯時,主要方式是增長了Any?這種可爲空的類型,使用Kotlin以後,咱們程序的空指針會獲得明顯的改善。

3.實用,高效率。Kotlin的實用具體表如今

  • 引入Object,便於咱們更好的應用單例模式
  • 引入data class, 避免了咱們手寫getter/setter/toString等方法
  • 引入參數默認值和具名參數,避免了沒必要要的方法重載
  • 支持擴展方法,讓咱們能夠省去好多必需要的代碼

4.Kotlin引入了Lambda,Streams API 和函數式編程支持。

  • Lambda表達式能夠省去了咱們建立不少匿名內部類的代碼(注因爲目前Kotlin基於JVM6,Lambda表達式在字節碼階段依然會翻譯成內部類形式)
  • Streams API 結合Lambda表達式和方法引用,讓咱們的代碼處理一件事情以描述的形式,而不是命令實現的方式。
  • Kotlin支持OOP(面向對象編程)和FP(函數式編程),語言自己並無限制,給了咱們選擇的自由,Kotlin對FP的友好支持,便於咱們寫出更加穩定,易於測試,無反作用的方法和代碼

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/

相關文章
相關標籤/搜索