咱们好,之前我现已写过了剖析kotlin1.5、1.6、1.7、1.9插件版别新增的一些特性,唯独kotlin1.8的特性还没好好讲讲,本篇文章就带咱们好好剖析下kotlin1.8新增了那些特性,能对咱们日常开发带来哪些协助。
其中Kotlin1.8.0供给的特性有限,本篇文章首要是剖析Kotlin1.8.20供给的一些新特性。下面是支撑该插件的IDE对应版别:

一. 供给功能更好的Enum.entries
替代Enum.values()

在之前,如果咱们想遍历枚举内部元素,咱们通常会写出以下代码:
enum class Color(val colorName: String, val rgb: String) {
RED("Red", "#FF0000"),
ORANGE("Orange", "#FF7F00"),
YELLOW("Yellow", "#FFFF00")
}
fun main() {
Color.values().forEach {
println("${it.rgb}--${it.colorName}--${it.name}")
}
}
可是不知道咱们是否清楚,Color.values()
其实存在功能问题,换句话说,每调用一次该办法,就会触发从头分配一块内存,如果调用的频率过高,就很或许引发内存颤动。
咱们可以反编译下枚举类简单看下原因:

Color.values()
每次都会调用Object.clone()
办法从头创建一个新的数组,这便是上面说的潜在的功能问题,github上也有相关的问题链接,感爱好的可以看下:HttpStatus.resolve allocates HttpStatus.values() once per invocation。
一起Color.values()
回来的是一个数组,而在咱们大多开发场景中,或许调集运用的频率更高,这就或许涉及到一个数组转调集的操作。
基于以上考虑,Kotlin1.8.20官方供给了一个新的特点:Color.entries
,这个办法会预分配一块内存并回来一个不可变调集,屡次调用也不会产生潜在的功能问题。
咱们简单看下运用:
fun main() {
Color.entries.forEach {
println("${it.rgb}--${it.colorName}--${it.name}")
}
}
输出:

一起咱们也可以从反编译的代码中看出区别:

不会每次调用都从头分配一块内存并回来。
如果想要运用这个特性,可以加上下面装备:
compileKotlin.kotlinOptions {
languageVersion = "1.9"
}
另外多说一下,IntelliJ IDEA 2023.1版别也会检测代码中是否存在Enum.values()
的运用,存在就提示运用Enum.entries
替代。
二. 答应内联类声明次级结构函数

内联类在Kotlin1.8.20之前是不答应带body的次级结构函数存在的,也便是说下面的代码运转会报错:
@JvmInline
value class Person( val fullName: String) {
constructor(name: String, lastName: String) : this("$name $lastName") {
check(lastName.isNotBlank()) {
"Last name shouldn't be empty"
}
}
}
fun main() {
println(Person("a", "b").fullName)
}
运转看下结果:

如果没有次级结构函数body,下面这样写是没问题的:
constructor(name: String, lastName: String) : this("$name $lastName")
如果想要支撑带body的次级结构函数,只需要在kotlin1.8.20插件版别上和上一个特性相同添加languageVersion = "1.9"
装备即可。
然后上面的代码块运转就没问题了,咱们看下输出:
fun main() {
println(Person("a", "").fullName)
}

准确的执行了次级结构函数body内的逻辑。
三. 支撑java synthethic特点引证

这个特性用文字不好解说,咱们直接通过代码去学习下该特性。
当前存在一个类Person1
:
public class Person1 {
private String name;
private int age;
public Person1(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
在Kotlin1.8.20之前,以下这种写法是会报错的:

而是有必要改成sortedBy(Person1::getAge)
才能运转通过。
和上面特性相同,如果想要支撑Person1::age
这种引证方法,只需要在kotlin1.8.20插件版别上和上一个特性相同添加languageVersion = "2.1"
装备即可。
PS:请注意,Kotlin官方网站提示装备
languageVersion = "1.9"
就能运用上面的实验特性,可是编译器仍是提示报错,然后你找报错提示信息改成了languageVersion = "2.1"
就正常了。
四. 新Kotlin K2编译器的更新

便是说目前Kotlin K2编译器仍是一个实验阶段,不过Kotlin官方在其stable的路上又添加了一些更新:
- 序列化插件的预览版别;
- JS IR编译器的alpha支撑;
- Kotlin2.0版别特性的引入;
如果咱们想要体会下最新版的Kotlin K2编译器,添加装备:languageVersion ="2.0"
即可。
五. Kotlin规范库支撑AutoCloseable

这个AutoCloseable
接口便是用来支撑资源封闭的,调配供给的use
扩展函数,就能协助咱们在资源流运用完毕后自动封闭。
Kotlin之所以在规范库中支撑,应该是想要支撑多渠道吧。
六. Kotlin规范库支撑Base64编解码
这儿不做太多介绍,看下面的运用比如即可:

七. Kotlin规范库@Volatile支撑Kotlin/Native
@Volatile注解在Kotlin/JVM便是确保线程之间可见性以及有序性的,kotlin官方在Kotlin/Native中也支撑了该注解运用,有爱好的可以实战试下作用。
总结
本篇文章首要是介绍了Kotlin1.8版别新增的一些特性,首要挑了一些我能了解的、常用的一些特性拉出来介绍,希望能对你有所协助。
历史文章
两个Kotlin优化小技巧,你绝对用的上
浅析一下:kotlin委托背后的完成机制
Kotlin1.9.0-Beta,它来了!!
聊聊Kotlin1.7.0版别供给的一些特性
聊聊kotlin1.5和1.6版别供给的一些新特性
kotlin密封sealed class/interface的迭代之旅
优化@BuilderInference注解,Kotlin高版别下了这些“棘手”!
@JvmDefaultWithCompatibility优化小技巧,了解一下~