2020年 8 月 17 日,Kotlin 1.4 版本正式发布。此次的版本更新花费了很多精力来提高 Kotlin 及其工具的性能和质量,例如高亮显示的速度提高了 1.5-4 倍,支持多种新的语言功能,例如 Kotlin 接口 SAM 转换。

在过去的一年中,超过 580 万开发者都曾使用过 Kotlin 编码,这个数据比上一年增加了 1.5 倍,而且还在增长。Kotlin 社区在全球拥有超过 200 个用户小组,在 2020 StackOverflow 开发者调查中,Kotlin 是最受开发者欢迎编程语言的第 13 位。

很多公司也选择将 Kotlin 作为首选语言,目前比较出名的使用 Kotlin 开发的软件包括:

服务器端:Atlassian、 Adobe、 ING Bank;Android:Google Home、 Duolingo、 Zomato;

多平台移动端:VMware、 PlanGrid 和 CashApp、Mirego Trikot;

Web:JetBrains Space、 Karhoo、 MIPT 核物理方法实验室 VisionForge。

新的编译器

新编译器实现的目标是变得更快速、统一 Kotlin 支持的所有平台,并提供用于编译器扩展的 API。这将是一项多年的工作,不过开发团队已开始好一阵子了,因此新实现的某些部分将在 1.4 中发布,可让这个过程变得更加平顺。

有些功能也已经发布了; 例如,如果您尝试了用于类型推理的新算法,它是新编译器的一部分。其他部分的处理方法相同。也就是说,两种版本都将在一段时间内可用,旧版本和新版本都将处于实验模式; 当新的稳定后,它将成为默认版本。

新的前端(front-end)加速

开发团队期望新编译器提高的速度将来自新的前端实现。

为了提供一些背景信息,可以将编译想成吸收源文件并将其逐步转换为可执行代码的管道。此管道的第一步俗称为编译器的前端。它解析代码和命名、执行类型检查等。此编译器的这一部分也可以在 IDE 中使用,来高亮显示语法错误、导航到定义并搜索项目中的符号用法。这是 kotlinc 如今花费最多时间的步骤,因此开发团队希望使其更快。

当前的实现尚未完成,并且不会在 1.4 中到来。但是,大多耗时的工作都是由它完成,因此我们可以预期提速的效果。基准测试(编译 YouTrack 和 Kotlin 编译器本身)表明,新前端的速度约为现有前端快 4.5 倍。

统一的后端和可扩展性

在前端完成对代码的分析之后,后端将生成可执行文件。目前有三个后端:Kotlin / JVM,Kotlin / JS 和 Kotlin / Native。前两个以往是独立编写的,没有代码共享。当我们启动 Kotlin / Native 时,它是基于围绕 Kotlin 代码内部表示(internal representation)构建的新基础架构的,该功能具有与虚拟机中的字节码类似的功能。

现在,开发团队计划将其他两个后端迁移到同一内部表示。因此,他们将共享许多后端逻辑并拥有统一的管道,以允许对所有目标仅执行一次大多数功能、优化和错误修复。

虽然正逐步迁移到新的后端,可是在 1.4 中,默认情况下不太可能启用它们,但用户将能够选择明确使用它们。

通用的后端基础结构为跨平台编译器扩展打开了大门。可以在这管道中添加一些自定义处理和/或转换,这些处理和转换将自动适用于所有目标。在 1.4 中将不提供用于此类扩展的公开 API(该 API 稍后将被稳定),但开发团队正在与合作伙伴 (其中包括已经构建其编译器插件的 JetPack Compose )紧密合作。

Kotlin 1.4 新功能

Kotlin 1.4 将提供一些新功能。

Kotlin1.4会在2020年发布。其中除了很多跨平台能力的补强之外,也有不少语法层面的改进,可能会对广大开发者带来更直接的影响

Kotlin支持SAM转换

SAM的意思是Singel Abstract Method,我们将只有单一方法的接口/抽象类成为SamType。Kotlin目前(最新1.3.6)仅能支持Java中的SAM转换

//java
public interface OnClickListener {void onClick(View v);
}
public class View {public void setOnClickListener(@Nullable OnClickListener l) {mOnClickListener = l}
}
//kt
view.setOnClickListener( object : OnClickListener {override fun onClick(v: View) {...}
})
// SAM转换
view.setOnClickListener {...
}

Kotlin通过SAM转换可以将Java中对SamType的调用,转换为一个对Lambda的调用,减少大量的模板代码,但是同样SamType如果定义在Kotlin中,是无法转换的:

interface Action {fun run()
}
fun runAction(a: Action) = a.run()fun main() {runAction {// error :Type mismatch.  // Required: Action// Found:  () → Unit           ...}
}

但是在1.4之后,可以通过为interface添加fun关键字, 声明为SamType,

fun interface Action {fun run()
}fun main() {runAction {println("Hello, KotlinConf!")}
}

即使在1.4之前,我们也有一些SAM转换的替代方案,详细可以参考这篇文 https://blog.csdn.net/vitaviva/article/details/104055623

混用命名参数和位置参数

Kotlin进行方法调用时可以通过参数名指定参数,也可以不指定,按照声明的顺序传参

fun f(a: Int, b: Int, c: Int) {}fun main() {f(1, 2, 3) //位置传参:按序传参f(a = 1, c = 3, b = 2) //命名传参:按参数名传参
}

但是不允许混合两种

fun main() {f(1, b = 2, 3) // Mixing named and positioned arguments is not allowed
}

1.4之后允许上面这种传参方式,这样参数过多的调用时可以提高代码可读性。

尾后逗号

当函数的参数比较多时,为了可读性,我们习惯换行书写:

fun f(a: Int,b: Int,c: Int, //error: Expecting an argument
) data class Item(val a: Int,val b: Int,val c: Int, //error: Expecting an argument
)

此时,如果需要增加参数或者交换位置时,总要额外删除最后一个参数尾部的逗号,1.4之后允许尾后逗号的存在,方便修改。

属性代理优化

我们自定义属性代理时,为了能够在调用getValue/setValue时获取KProperty,Kotlin在编译期会生成一个$$delegatedProperties数组,用来存储所有可能用到KProperty

//定义代理
class Delegate {lateinit var real : Stringoperator fun getValue(thisRef: Any?, property: KProperty<*>): String {return real}operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {println("${property.name}: $value")real = value}//使用代理
class MyClass {var s by Delegat {"hello"}s = "hello kotlin"
}

反编译java后会发现多了$$delegatedProperties

public final class MyClass {static final kotlin.reflect.KProperty[] $$delegatedProperties; //存储KProperty...KProperty var2 = $$delegatedProperties[0];s.setValue((Object)null, var2, "hello kotlin");
}

但很多时候我们不使用KProperty,此时没有必要生成
delegatedProperties。Kotlin1.4优化了这种case,如果我们在operator前加inline,且使用KProperty的话,就不回再生成
delegatedProperties。例如 未来1.4中lazy的代理定义如下

//定义
inline operator fun <T> Lazy<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value

反编译的Java将不会再生成$$delegatedProperties。

參考資料

https://kotlinlang.org/
https://blog.jetbrains.com/kotlin/2020/08/kotlin-1-4-released-with-a-focus-on-quality-and-performance/
https://kotlinlang.org/docs/tutorials/getting-started.html


Kotlin开发者社区

专注分享 Java、 Kotlin、Spring/Spring Boot、MySQL、redis、neo4j、NoSQL、Android、JavaScript、React、Node、函数式编程、编程思想、"高可用,高性能,高实时"大型分布式系统架构设计主题。

High availability, high performance, high real-time large-scale distributed system architecture design

分布式框架:Zookeeper、分布式中间件框架等
分布式存储:GridFS、FastDFS、TFS、MemCache、redis等
分布式数据库:Cobar、tddl、Amoeba、Mycat
云计算、大数据、AI算法
虚拟化、云原生技术
分布式计算框架:MapReduce、Hadoop、Storm、Flink等
分布式通信机制:Dubbo、RPC调用、共享远程数据、消息队列等
消息队列MQ:Kafka、MetaQ,RocketMQ
怎样打造高可用系统:基于硬件、软件中间件、系统架构等一些典型方案的实现:HAProxy、基于Corosync+Pacemaker的高可用集群套件中间件系统
Mycat架构分布式演进
大数据Join背后的难题:数据、网络、内存和计算能力的矛盾和调和
Java分布式系统中的高性能难题:AIO,NIO,Netty还是自己开发框架?
高性能事件派发机制:线程池模型、Disruptor模型等等。。。

合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。不积跬步,无以至千里;不积小流,无以成江河。

Kotlin 简介

Kotlin是一门非研究性的语言,它是一门非常务实的工业级编程语言,它的使命就是帮助程序员们解决实际工程实践中的问题。使用Kotlin 让 Java程序员们的生活变得更好,Java中的那些空指针错误,浪费时间的冗长的样板代码,啰嗦的语法限制等等,在Kotlin中统统消失。Kotlin 简单务实,语法简洁而强大,安全且表达力强,极富生产力。

Java诞生于1995年,至今已有23年历史。当前最新版本是 Java 9。在 JVM 生态不断发展繁荣的过程中,也诞生了Scala、Groovy、Clojure 等兄弟语言。

Kotlin 也正是 JVM 家族中的优秀一员。Kotlin是一种现代语言(版本1.0于2016年2月发布)。它最初的目的是像Scala那样,优化Java语言的缺陷,提供更加简单实用的编程语言特性,并且解决了性能上的问题,比如编译时间。 JetBrains在这些方面做得非常出色。

Kotlin语言的特性

用 Java 开发多年以后,能够尝试一些新的东西真是太棒了。如果您是 Java 开发人员,使用 Kotlin 将会非常自然流畅。如果你是一个Swift开发者,你将会感到似曾相识,比如可空性(Nullability)。 Kotlin语言的特性有:

1.简洁

大幅减少样板代码量。

2.与Java的100%互操作性

Kotlin可以直接与Java类交互,反之亦然。这个特性使得我们可以直接重用我们的代码库,并将其迁移到 Kotlin中。由于Java的互操作性几乎无处不在。我们可以直接访问平台API以及现有的代码库,同时仍然享受和使用 Kotlin 的所有强大的现代语言功能。

3.扩展函数

Kotlin 类似于 C# 和 Gosu, 它提供了为现有类提供新功能扩展的能力,而不必从该类继承或使用任何类型的设计模式 (如装饰器模式)。

4.函数式编程

Kotlin 语言一等支持函数式编程,就像Scala一样。具备高阶函数、Lambda 表达式等函数式基本特性。

5.默认和命名参数

在Kotlin中,您可以为函数中的参数设置一个默认值,并给每个参数一个名称。这有助于编写易读的代码。

6.强大的开发工具支持

而由于是JetBrains出品,我们拥有很棒的IDE支持。虽然Java到Kotlin的自动转换并不是100% OK 的,但它确实是一个非常好的工具。使用 IDEA 的工具转换Java代码为 Kotlin 代码时,可以轻松地重用60%-70%的结果代码,而且修改成本很小。

Kotlin 除了简洁强大的语法特性外,还有实用性非常强的API以及围绕它构建的生态系统。例如:集合类 API、IO 扩展类、反射API 等。同时 Kotlin 社区也提供了丰富的文档和大量的学习资料,还有在线REPL。

A modern programming language that makes developers happier. Open source forever

图来自《Kotlin从入门到进阶实战》 (陈光剑,清华大学出版社)

图来自《Kotlin从入门到进阶实战》 (陈光剑,清华大学出版社)

https://kotlinlang.org/


http://www.taodudu.cc/news/show-2355952.html

相关文章:

  • 怎样写好一篇高质量的技术文章?
  • 一切皆是文件:UNIX,Linux 操作系統的設計哲學
  • UML类图详细介绍
  • 川土微电子 | CA-IS3050U隔离式CAN收发器
  • 土木学matlab还是python_五行属土的字大全
  • 合抱之木,生于毫末。九层之台,起于累土。千里之行,始于足下
  • UML - 类图的关系总结
  • JAVA基础之异常
  • 九尺之台,始于垒土
  • Android 设计素材积累(九层之台起于垒土)
  • 初识Python必看基础知识~ 续(6)九层之台,起于垒土,肝肝肝~
  • 九层之台,起于垒土
  • 文学de垒土
  • 九层之台,始于垒土;合抱之木,始于毫末;千里之行,始于足下!
  • 合抱之木,生于毫末; 九层之台,起于垒土。
  • Android APP安全测试
  • 【电子商务法】北邮国际学院大三上期末复习
  • 大数据架构和模式
  • 2020上半年DeFi行业研究报告-Part2 发行 | TokenInsight
  • 独家研究 I 某新一线城市中高端养老社区项目(CCRC)入住客户画像深度洞察研究报告
  • Java基础:第5-6章(重点)
  • 刑事实务办案中疑难问题
  • 正确认识P2P,从容面对风暴
  • 当前网络安全风险及举例
  • 互联网金融学习总结(1)——互联网金融(ITFIN)概念相关学习
  • Chainlink的77种用法
  • 合同法律风险管理 被骗者刑事风险
  • 8 种流行的计算机视觉应用
  • 如何区分P2P是互联网创新还是非法集资?最高检回应
  • 肖飒:区块链应用创业的法律边界及案例分析 | 清华x-lab公开课

Kotlin 1.4 版本正式发布:新功能一覽相关推荐

  1. win10 linux 1903,win10最新版本1903新功能

    在微软再一次推出了新版本win101903之后,小伙伴们一定很想知道这次更新微软又推出了什么新功能吧.据小编所知,此次更新除了修复了之前版本出现在bug和功能缺陷之外,还新增了内置应用可以卸载.亚克力 ...

  2. FLStudio21中文版本全部新功能讲解

    万众期待的FL Studio 21版本将于正式发布上线,目前在紧锣密鼓的安排上线中,届时所有购买正版 FL Studio 的用户,都可以免费升级到21版!按照惯例,本次新版也会增加全新插件,来帮助大家 ...

  3. PHP5各个版本的新功能和新特性总结(转载 http://www.jb51.net/article/48150.htm)

    本文目录: PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Her ...

  4. Win11正式发布新功能

    2014年,微软发布了win10系统,后来微软号称win10将是最后一版系统,以后不会再有win11什么的玩意儿,但是,今年微软还是发布了win11. 科技界的大佬说话,永远不要相信,小米还说自己不会 ...

  5. mac securecrt程序无响应_Adobe庆祝Photoshop问世30周年 为Mac和iPad版本提供新功能

    Adobe今天庆祝Photoshop诞生30周年,之前它已经在Mac和iPad上对该应用程序进行了多次更新.Mac上的一项重要新功能是支持MacOS Mojave和更高版本上的黑暗模式.Photosh ...

  6. MIUI12查看Android版本,MIUI12新功能与支持机型一览 开发版内测申请教程

    4月27日下午的小米10青春版发布会上,小米首先带来了全新的MIUI12,新的系统对Android进行了全方位的优化,和上一版MIUI11相比,在UI设计和细节功能等各个方面都有了明显的提升.根据发布 ...

  7. 计算机uc,解密UC浏览器计算机版本的新功能

    解密UC浏览器红色杏子工具 计算机版本的UC浏览器随附一个相对易于使用的工具-Hongxing XX,它可以帮助您突破某些人为限制的网络环境(例如防火墙阻止企业中的网站). 此工具用于阻止用户网络环境 ...

  8. Kotlin 一个好用的新功能:Parcelize

    在开发中,如果有需要用到序列化和反序列化的操作,就会用到 Serializable 或者 Parcelable,它们各有优缺点,会适用于不同的场景. Serializable 的优点是实现简单,你只需 ...

  9. VS 2019 16.11正式发布 | 新功能(Hot Reload 热重载)试用

    VS 2019 16.11 VS 2019 16.11已于2021.8.10正式发布.(https://devblogs.microsoft.com/visualstudio/visual-studi ...

  10. ONLYOFFICE文档v7.3版本携新功能发布了!

    ONLYOFFICE 文档 v7.3 现已发布:新增字段填写接收人角色.SmartArt.全新安全性设置.查看窗口等功能 在我们最新版本的在线编辑器中现已提供高级表单.SmartArt图形插入.增强密 ...

最新文章

  1. 数据竞赛Tricks集锦
  2. Linux系统检测命令有哪些
  3. mysql排列组合实现_Java实现数列的排列组合
  4. 《JavaScript高级程序设计》阅读笔记(一):ECMAScript基础
  5. 男子网购二手苹果手表 竟收到这些东西 怒斥卖家:你这个骗子!
  6. 计算机系统建模与仿真论文,计算机模拟 仿真论文.doc
  7. Emberjs学习之路(一)
  8. LOJ#2764. 「JOI 2013 Final」JOIOI 塔
  9. 初识验收测试管理工具FitNesse
  10. C++中使用sort函数给数组排序
  11. 110kV终端变电站电气部分设计
  12. OpenCV4图像处理算子不完全手册-入门篇(已完结)
  13. 【3款文献阅读的插件】
  14. python基本写法_python操作文件常用写法
  15. 读书笔记:《明朝那些事第三部:妖孽宫廷》
  16. 【用户角色权限设计】
  17. SSH框架报 org.hibernate.impl.QueryImpl cannot be cast to com.gao.ruan.pojos.Category
  18. 樱道,空蝉,雨空,夏恋,雨道,彩月,幻昼,惊梦,白夜。这些纯音乐
  19. m4a怎么转换成mp3,4招搞定
  20. 一文读懂Apache Kylin

热门文章

  1. WinSocket模型的探讨——select模型
  2. 深圳租房你必须知道的问题有哪些?
  3. 2825 codevs危险的组合(递推)
  4. Win10:更改桌面路径位置,彻底解放你的C盘
  5. mysql查询分数前三个_MySQL中查询获取每个班级成绩前三名的学生信息
  6. 如何看懂计算机英文文档,如何看英文技术文档
  7. 数字化背景下的经济社会发展的新特征 新趋势
  8. 计算机讲Word文档中的组合,电脑Word文档中两个表格如何合并
  9. 【方法篇】研究RNA互作结合蛋白(RBPs)的方法
  10. 三分钟帮你集成极光推送——和那些你可能不知道的事