Kotlin 1.4 版本正式发布:新功能一覽

2020-08-22 18:19:49 浏览数 (1)

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转换

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

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

代码语言:javascript复制
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,

代码语言:javascript复制
fun interface Action {
    fun run()
}
 
fun main() {
    runAction {
        println("Hello, KotlinConf!")
    }
}

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

混用命名参数和位置参数

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

代码语言:javascript复制
fun f(a: Int, b: Int, c: Int) {}
 
 
fun main() {
    f(1, 2, 3) //位置传参:按序传参
    f(a = 1, c = 3, b = 2) //命名传参:按参数名传参
}

但是不允许混合两种

代码语言:javascript复制
fun main() {
    f(1, b = 2, 3) // Mixing named and positioned arguments is not allowed   
}

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

尾后逗号

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

代码语言:javascript复制
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

代码语言:javascript复制
//定义代理
class Delegate {
    lateinit var real : String
    operator 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

代码语言:javascript复制
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的代理定义如下

代码语言:javascript复制
//定义 
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

0 人点赞