[关闭]
@levinzhang 2017-03-14T23:14:48.000000Z 字数 1594 阅读 352

Kotlin 1.1新增协程、类型别名特性,提升了对JavaScript的支持

by Sergio De Simone on Mar 09, 2017

摘要:

Kotlin的市场主管Roman Belov撰文写到,Kotlin的新版本引入了多项新的语言特性(其中最值得注意的就是协程),同时还提升了对其JavaScript目标环境的支持。


Kotlin的市场主管Roman Belov撰文写到,Kotlin的新版本引入了多项新的语言特性(其中最值得注意的就是协程),同时还提升了对其JavaScript目标环境的支持。

尽管依然被认为处于试验性阶段,但是Kotlin 1.1最关键的新特性之一就是协程(coroutine),这个特性可以通过使用三个高层级的构造(construct)来实现:asyncawaityield。举例来说:我们可以采用asyncawait来处理异步操作:

  1. // 在后台线程池中运行代码
  2. fun asyncOverlay() = async(CommonPool) {
  3. // 开启两个异步操作
  4. val original = asyncLoadImage("original")
  5. val overlay = asyncLoadImage("overlay")
  6. // 然后,将overlay应用到这两个结果上
  7. applyOverlay(original.await(), overlay.await())
  8. }
  9. // 在UI上下文中启动新的协程
  10. launch(UI) {
  11. // 等待异步overlay完成
  12. val image = asyncOverlay().await()
  13. // 然后在UI上显示
  14. showImage(image)
  15. }

注意,这里使用了launch,它会启动一个协程。实际上,await只能在一个协程中使用或者在使用关键字suspend声明的函数中使用,这样的话,能够让编译器生成相应的代码,从而在协程中运行函数:

  1. suspend fun workload(n: Int): Int {
  2. delay(1000)
  3. return n
  4. }

在上例中,delay推迟了协程,并不会阻塞它关联的线程。

协程还能以懒加载的方式借助yield生成序列:

  1. // 推断出的类型为Sequence<Int>
  2. val fibonacci = buildSequence {
  3. yield(1) // 第一个Fibonacci数字
  4. var cur = 1
  5. var next = 1
  6. while (true) {
  7. yield(next) // 下一个Fibonacci数字
  8. val tmp = cur + next
  9. cur = next
  10. next = tmp
  11. }
  12. }
  13. println(fibonacci.take(10).joinToString())

因为还是试验性的,协程目前只是选择性使用状态(opt-in),它们的API在未来的释放版本中可能会有所变更。

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

在对JavaScript的支持方面,1.1版本的主要目标是让对JavaScript的支持能够达到与JVM对等的程度。这意味着,所有的语言特性都可以在这两个目标平台中使用,不过反射除外,目前JavaScript还没有这样的特性。尤其是:

我们可以使用在线的REPL来尝试Kotlin,也可以按照多种不同的方式来进行安装。

查看英文原文:Kotlin 1.1 Adds Coroutines, Type Aliases, Improved JavaScript Support

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注