BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Sergio De Simone 关注 13 他的粉丝 ,译者 张卫滨 关注 13 他的粉丝 发布于 2017年3月16日. 估计阅读时间: 5 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT