探索Kotlin 1.8.20新特性

探索Kotlin 1.8.20新特性

kotlin1.8.20
Kotlin 1.8.20已经发布,我们将探索一些新功能和改进。

  • 我们将仅涵盖新的语言功能标准库更新
  • 请参考参考资料部分以了解此版本的完整详情。

语言更新

Enum 类entries函数

为什么需要这个函数?
values() - 返回数组,大多数情况下我们会将其转换为列表进行操作。与列表相比,数组的性能较低。
enum

enum class Language(val extension: String) {
    
    
    Kotlin(".KT"),
    Java(".java"),
    Dart(".dart")
}

// values - Returns Array
val languageValues:Array<Language> = Language.values()


// New function entries - Returns List
val languageEntries:List<Language> = Language.entries

Data objects

  • 为了提高可读性,我们引入了这个新特性。
  • 它具有整洁清晰的toString()表示形式。
object EmployeeObject

data object EmployeeDataObject

// Output

println(EmployeeObject)

println(EmployeeDataObject) 

// EmployeeObject@50040f0c

// EmployeeDataObject

在内联类中次级构造函数可有函数体

从1.8.20版本开始,我们可以在内联类中使用带有函数体的次构造函数。

@JvmInline
value class Employee(private val fullName: String) {
    
    
    // Allowed since Kotlin 1.4.30:
    init {
    
    
        check(fullName.isNotBlank()) {
    
    
            "Full name shouldn't be empty"
        }
    }

    // Preview available since Kotlin 1.8.20:
    constructor(firstName: String, middleName:String, lastName: String) : this("$firstName $middleName $lastName") {
    
    
        check(lastName.isNotBlank()) {
    
    
            "Last name shouldn't be empty"
        }
    }
}

标准库更新

新增了Autocloseable接口

为了关闭资源,常见的标准库中添加了AutoCloseable接口。
还包括了扩展函数use(),它在所选资源上执行给定的块函数,然后无论是否抛出异常,都会正确关闭它。

Base64编码和解码

现在在Kotlin中我们有了Base64的支持,所以不再需要Java了

有三种类型可用
Base64.DefaultBase64.UrlSafeBase64.Mime

@OptIn(ExperimentalEncodingApi::class)
fun base64Experimental() {
    
    
    // Base64.Default
    val nameBytes = "Nav".map {
    
     it.code.toByte() }.toByteArray()
    val encodedValue = Base64.Default.encode(nameBytes)
    // Encode value: TmF2
    println("Encoded: $encodedValue") 
    // Decoded value: Nav
    println("Decoded: ${
      
      String(Base64.Default.decode(encodedValue))}")
    
    // Base64.UrlSafe
    val googleIOUrlBytes = "google.io".map {
    
     it.code.toByte() }.toByteArray()
    // Encode value: Z29vZ2xlLmlv
    val encodedURLSafe = Base64.UrlSafe.encode(googleIOUrlBytes)
    println("Encoded UrlSafe: $encodedURLSafe")
    // Decoded value: google.io
    println("Decoded UrlSafe: ${
      
      String(Base64.UrlSafe.decode(encodedURLSafe))}")
}

对Kotlin/Native的@Volatile注解的支持

在1.8.20之前,@Volatile注解只在公共标准库中可用,并且在JVM中有效。

class Developer {
    
    
    @Volatile
    private var isAndroidDev: Boolean = false

    fun isAndroidDevloper(): Boolean = isAndroidDev

    fun setAndroidDev(isAndroidDev: Boolean) {
    
    
        this.isAndroidDev = isAndroidDev
    }

}

Kotlin/JVM

  • Java合成属性引用的预览功能
public class Developer {
    
    
    private String name;
    private String coreLanguage;

    public Developer(String name, String coreLanguage) {
    
    
        this.name = name;
        this.coreLanguage = coreLanguage;
    }

    public String getName() {
    
    
        return name;
    }

    public String getCoreLanguage() {
    
    
        return coreLanguage;
    }
}
  • 使用引用调用属性
val developer = Developer("Nav", "Kotlin")

    // references to Java synthetic properties
    print("Developer name is ${
      
      developer::name}")

参考

[kotlin1.8.20新特性] https://kotlinlang.org/docs/whatsnew1820.html

猜你喜欢

转载自blog.csdn.net/u011897062/article/details/130831810
今日推荐