写点什么

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

  • 2017-03-15
  • 本文字数:1123 字

    阅读完需:约 4 分钟

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<int>
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())
</int>

因为还是试验性的,协程目前只是选择性使用状态(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

2017-03-15 19:003279

评论

发布
暂无评论
发现更多内容

TCP协议:如何保证页面文件能被完整送达浏览器?

Tristan

前端 网络层 TCP协议

CPU占用率爆满,服务器遭遇挖矿如何排查

山河已无恙

Linux 3月月更

详解Swin Transformer核心实现,经典模型也能快速调优

百度大脑

不联网的情况下,使用 electron-builder 快速打包全平台应用

编程三昧

Electron 3月月更 electron-builder

推荐 10 本 Go 经典书籍,从入门到进阶(含下载方式)

AlwaysBeta

Go golang 编程语言 书单推荐 Go 语言

在数字化与绿色的双轮之间,华为为全球企业搭建一道“车轴”

脑极体

Web 键盘输入法应用开发指南 (5) —— 实战技巧

天择

JavaScript 键盘 实战 输入法 3月月更

ZStack 与龙蜥操作系统完成兼容性认证,共同打造安全可信的云+OS技术生态

OpenAnolis小助手

云计算 开源 操作系统 云平台

运维接受新挑战!网易云原生运维体系建设之路

网易数帆

Kubernetes 云原生 运维自动化

群晖 NAS 安装的 Docker MySQL 数据库没有办法通过局域网连接

HoneyMoose

注入语句详解(get注入,cookie注入,搜索型注入等)

喀拉峻

网络安全

千万级学生管理系统的考试试卷存储方案

阿卷

架构实战营

如何避免黑客攻击?国内首个云端加密代码库来帮忙

阿里云云效

阿里云 云原生 云效 代码安全 代码加密

VuePress 博客如何开启本地 HTTPS 访问

冴羽

JavaScript Vue 前端 vuepress 博客搭建

OCR产业应用实战,多类别电表读数识别方案详解

百度大脑

教你3种Kafka的指定副本作为Leader的实现方式

华为云开发者联盟

Leader Kafk 副本 AR顺序

Curve 加入 PolarDB 开源数据库社区,强化分布式共享存储

网易数帆

数据库 postgresql 云原生 分布式存储 polarDB

深入分析沙箱逃逸漏洞

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞

OceanBase 推出全新品牌 slogan

OceanBase 数据库

数据库 oceanbase 品牌slogan

java培训:多个线程同时访问一个类是否有问题方法

@零度

JAVA开发

Docker原理——数据包怎么发出去

kof11321

容器 原理 容器网络方案

Android编译优化系列-kapt篇

字节跳动终端技术

android 字节跳动 编译优化 火山引擎 火山引擎MARS

烂书!《气候经济与人类未来》

懒时小窝

烂书

编程和英语,数学到底什么关系

北极的大企鹅

思维转换 编程思想

编程术语的类比(一)

北极的大企鹅

思维转换 编程思想

推荐学java——SpringMVC第一课

逆锋起笔

springmvc java框架 Spring Java 3月月更

ICLR 2022|唯快不破!北航、NTU、百度飞桨提出面向极限压缩的全二值化BiBERT

百度大脑

你真的会 i++吗

爱笑的小雨

性能测试中过滤异常的响应时间

FunTester

性能测试 HTTP 接口测试 响应时间 FunTester

编程术语的类比(二)

北极的大企鹅

学习 思维转换 编程思想

别再用 Redis List 实现消息队列了,Stream 专为队列而生

CRMEB

Kotlin 1.1新增协程、类型别名特性,提升了对JavaScript的支持_Java_Sergio De Simone_InfoQ精选文章