#土豆記事# ——學習Kotlin(Android中的Swift)

概覽

以前咱們學習過如何寫一個簡單的Android App。
爲了遇上潮流,我特意去學習了下Jetbrains開發的新語言 —— Kotlinhtml

不想說太多的概念,總結出來就是 Swift on JVM
那麼爲何要用它呢,我喜歡它的理由不少:java

  1. 帶來了Nullable Safe特性 —— 之後不再怕討厭的 Null Pointer Exception了。
  2. 閉包閉包閉包 —— 重要的事情說三遍.
  3. Smart Type Case —— 很智能的一個特性,當你使用if檢查是不是某種類型之後,自動轉換爲指定類型。
  4. 沒有附加的Runtime —— iOSer 看到這會不會哭.
  5. Kotlin stdlib 很是小,打包後Apk的體積幾乎沒有變化,也不用擔憂方法數超過限制。

總而言之,就是用極小的代價換來了咱們許多振奮人心的特性,那麼你心動了麼?
固然,在心動以前也要理智,咱們要知道Kotlin暫時尚未發佈"正式版",一直在0.x.x版本號中徘徊,若是你足夠膽大(像我),那麼你大能夠一試。git

老規矩先補上官方文檔傳送門:http://kotlinlang.org/docs/reference/basic-syntax.htmlgithub

一些基本的語法如——基礎類型、流程控制、類與繼承等等特性咱們已經不陌生,咱們來看看幾個新特性。算法

Nullable Safe

我翻譯過來是空指針安全監測,什麼意思呢?看下以下語法糖(Swift Developer能夠直接跳過)
好比安全

var text:String? = null
text?.length()

若是是java代碼,在text變量爲null的時候,調用text.length()是會崩潰滴,那麼在這裏,咱們用了?來告訴編譯器,若是textnull,則返回null,不然返回text.length(),具體翻譯過來就是這樣:閉包

if (text == null) {
   return null;
} else {
   return text.length()
}

看咱們少了這麼多判斷,這個語法糖是否是很棒?函數

Closure & Lambda & Higer-Order Functions

介紹我最愛的閉包,那麼在java 8如下的版本中,java是沒有閉包這個特性的,舉個例子,你的函數不能被當成一個對象使用,必須使用一個接口封裝,而咱們使用Kotlin就能夠直接傳函數當形參啦!性能

fun lock<T>(lock: Lock, body: () -> T): T {
  lock.lock()
  try {
    return body()
  }
  finally {
    lock.unlock()
  }
}

此處咱們的body形參就是一個0參數返回類型爲T的函數,能夠做爲咱們的回調函數使用,而不用像java同樣定義又臭又長的接口,再傳入使用。學習

fun dfs(graph: Graph) {
  fun dfs(current: Vertex, visited: Set<Vertex>) {
    if (!visited.add(current)) return
    for (v in current.neighbors)
      dfs(v, visited)
  }

  dfs(graph.vertices[0], HashSet())
}

這是一個典型的dfs算法,使用Kotlin的高階函數特性——能夠在函數內定義函數。

Smart Type Case

智能類型轉換,什麼意思呢?show一段代碼

if (str is String) {
    return str.length()
} else if (str is Int) {
    return str.toString()
}

咱們知道Int類型是沒有length這個方法的,也就是通過這個if判斷,若是知足if條件的話,編譯器自動幫咱們轉換成咱們要的類型,而後供咱們調用。

我試着在SegmentFault for Android中加入對Kotlin的支持,在加入Kotlinlib先後,包大小並無明顯增加(1M如下),性能亦沒有下降,因此用戶是感知不出來內部發生了什麼變化。
綜上所述,我要給Kotlin點贊!

Demo

我把土豆記事全部的代碼所有改爲Kotlin的實現,並開源到Github上 
https://github.com/geminiwen/tudounotepad
你們能夠clone下來學習,也很是感謝你們對個人支持。
(順便跪求各類star star star)

歡迎關注我Github 以及 @Gemini

相關文章
相關標籤/搜索