Kotlin 1.1新增協程、型別別名特性,提升了對JavaScript的支援

weixin_34253539發表於2017-03-15

Kotlin的市場主管Roman Belov撰文寫到,Kotlin的新版本引入了多項新的語言特性(其中最值得注意的就是協程),同時還提升了對其JavaScript目標環境的支援。

\\

儘管依然被認為處於試驗性階段,但是Kotlin 1.1最關鍵的新特性之一就是協程(coroutine),這個特性可以通過使用三個高層級的構造(construct)來實現:asyncawaityield。舉例來說:我們可以採用asyncawait來處理非同步操作:

\\
\// 在後臺執行緒池中執行程式碼\fun asyncOverlay() = async(CommonPool) {\    // 開啟兩個非同步操作\    val original = asyncLoadImage(\"original\")\    val overlay = asyncLoadImage(\"overlay\")\    // 然後,將overlay應用到這兩個結果上\    applyOverlay(original.await(), overlay.await())\}\// 在UI上下文中啟動新的協程\launch(UI) {\    // 等待非同步overlay完成\    val image = asyncOverlay().await()\    // 然後在UI上顯示\    showImage(image)\}\
\\

注意,這裡使用了launch,它會啟動一個協程。實際上,await只能在一個協程中使用或者在使用關鍵字suspend宣告的函式中使用,這樣的話,能夠讓編譯器生成相應的程式碼,從而在協程中執行函式:

\\
\suspend fun workload(n: Int): Int {\    delay(1000)\    return n\}\
\\

在上例中,delay推遲了協程,並不會阻塞它關聯的執行緒。

\\

協程還能以懶載入的方式藉助yield生成序列:

\\
\// 推斷出的型別為Sequence\val fibonacci = buildSequence {\    yield(1) // 第一個Fibonacci數字\    var cur = 1\    var next = 1\    while (true) {\        yield(next) // 下一個Fibonacci數字\        val tmp = cur + next\        cur = next\        next = tmp\    }\}\println(fibonacci.take(10).joinToString())\
\\

因為還是試驗性的,協程目前只是選擇性使用狀態(opt-in),它們的API在未來的釋放版本中可能會有所變更。

\\

Kotlin 1.1新增的其他重要的新特性包括:

\\
  • 型別別名,允許使用者為某種型別定義其他的名稱。 \\
  • ::操作符能夠獲取特定物件某個方法的成員引用。 \\
  • 資料類可以進行擴充套件。 \\
  • 在lambdas中支援Destructuring。\

在對JavaScript的支援方面,1.1版本的主要目標是讓對JavaScript的支援能夠達到與JVM對等的程度。這意味著,所有的語言特性都可以在這兩個目標平臺中使用,不過反射除外,目前JavaScript還沒有這樣的特性。尤其是:

\\
  • Kotlin標準庫中很大一部分都可以用在JavaScript上。 \\
  • 生成的程式碼對JavaScript工具更加友好,比如壓縮器(minifier),優化器(optimizer)等等。 \\
  • 用於Kotlin類宣告的external修飾符目前在JavaScript中已經實現了。\

我們可以使用線上的REPL來嘗試Kotlin,也可以按照多種不同的方式來進行安裝。

\\

檢視英文原文Kotlin 1.1 Adds Coroutines, Type Aliases, Improved JavaScript Support

相關文章