大家好,最近看到kotlin官网上放出了kotlin的1.9.0-Beta版,不知道为啥,看到新事物出现就很开心,特地写篇文章简简单单介绍一下。
前提:插件安装
笔者使用IDE为intellij idea2023最新社区版,通过左上角打开File->Settings->Languages & Frameworks -> Kotlin:
将最上面的Update Channel更改为Early Access Preview,然后点击右边的Check again,一会下面就会提示kotlin 1.9.0-Beta可以安装了,选择安装即可。
PS:避免使用Intellij idea太旧版本,笔者使用了2021社区版无法检测出kotlin最新插件版本,下面贴一个官网截图以供参考:
接下来我们就来了解下kotlin新版本的一些特性吧。
一. 新操作符..>
的支持
该操作符1.7.20引入了实验版本,到了该新版本才变为stable状态。这是一个范围操作符,并且区间属于左闭右开的。
我们写一个简单的例子:
fun main() {
for (i in 0 ..< 10) {
println("print: $i")
}
}
看下输出结果:
没有这个新操作符,还记得我们之前用啥实现区间左闭右开的操作吗?是until
。
fun main() {
for (i in 0 until 10) {
println("print: $i")
}
}
可以看到输出结果和..<
一摸一样。官方为啥要提供一个重复的操作符呢,主要就是因为 ..<
比until
更加生动形象、直观的提示程序,这是一个左闭又开的区间,尽可能避免程序犯错。
这里顺便说下..<
和until
简单区别 :
-
until
是一个中缀方法 : -
..<
是运算符重载函数:
一些场景下,我们可以重写上面的函数,自定义一些实现逻辑,来实现优雅的代码编写。
二. gradle configuration cache将在kotlin多平台支持
gradle生命周期分为三个阶段:初始化、配置( configuration )和执行。在配置阶段,主要是解析各项目下的build.gradle脚本,并构造task任务图。所以,如果能开启配置阶段缓存,可以提升我们项目的编译效率,降低项目编译时间。
笔者这里并没有去专门测试,只是做一个说明性的讲解。同时请大家注意,想要支持配置阶段缓存,可能并不是一项简单的工作,项目可能也需要做许多的适配工作,记得之前看文章好像有看到过一些gradle编译阶段添加的监听器将无法被支持等等,具体的适配还请大家去阅读官方文档细细探究。
三. Kotlin/Native下访问常量不再初始化对象
在讲解这个前,我们先了解Kotlin/JVM
访问类中常量会导致类被创建初始化吗?看下面一段代码:
object MyObject {
init {
println("side effect!")
}
const val y = 1
}
然后进行第一次调用:
fun main() {
println(MyObject.y)
}
输出的结果为:
然后进行第二次调用:
fun main() {
val x = MyObject
println(x.y)
}
输出结果为:
通过上面的运行结果可知,Kotlin/JVM
访问常量并不会导致类被初始化创建。而在Kotlin/Native
下,相同的代码运行结果就不会相同了。
在Kotlin插件版本1.9.0-Beta之前,Kotlin/Native
访问常量就会导致类被初始化创建,我们还是拿上面的例子进行讲解。
PS:想要搭建一个简单的Kotlin/Native开发环境,可以参考官方文档:Create a new Kotlin/Native project in IntelliJ IDEA
将下面代码通过Build Project构建成一个exe文件:
输出的exe后缀文件路径在:
进入到该目录并运行./KNTest.ext
:
可以看到,我们只是访问了MyObject
中的常量y
,就直接导致MyObject
类对象被初始化创建了,这个表现看起来有些糟糕。
所以在Kotlin插件1.9.0-Beta版本,官方对这个进行了优化,在Kotlin/Native
端访问类中常量,不会再导致类被初始化了,即上面的“side effect!”不会被输出。这样使得Kotlin/Native和Kotlin/JVM
的行为保持一致,同时也潜在的对Kotlin/Native一些场景下的性能表现产生积极影响。
四. 新增createParentDirectories()
创建父级目录
这个比较简单,就是官方引入了一个新的api:createParentDirectories()
,该api会检测文件路径的父级目录是否存在,如果不存在就会进行创建。
看一个简单的例子:
fun main() {
val path = Path("F:\KotlinPlay\test1\test11\test111.txt")
path.createParentDirectories()
}
运行上面代码,就会在我的项目下帮我创建test1和test11这两个原本不存在的目录:
请记住,这个api并不会帮助你创建文件,只是会创建不存在的父级目录。
五. K2新编译器的更新
对应Kotlin新编译器笔者了解不多,不过想想最起码会对我们项目的编译效率提升肯定是有帮助的,以及还会支持各种牛逼的特性。
给大家推荐一篇程序员张同学写的一篇文章,能让你对K2编译器有个基本大致的了解:K2 编译器是什么?世界第二高峰又是哪座?
总结
本篇文章主要介绍了kotlin 1.9.0-Beta插件版本新增的一些特性,其实还有几个特性没进行提及,主要是要么没啥介绍的必要,要么我也不懂(比如和iOS相关的特性)。希望本篇文章能对你有所帮助。
历史文章
这里是我整理的过往kotlin特性介绍的历史文章,大家感兴趣可以阅读下:
kotlin密封sealed class/interface的迭代之旅
优化@BuilderInference注解,Kotlin高版本下了这些“毒手”!
@JvmDefaultWithCompatibility优化小技巧,了解一下~
参考文章
What’s new in Kotlin 1.9.0-Beta