Kotlin:1.8.0 的新特性

一、概述

Kotlin 1.8.0版本英语官方文档

Kotlin 1.8.0 中文官方文档

The Kotlin 1.8.0 release is out and here are some of its biggest highlights:

Kotlin 1.8.0发布了,下面是它的一些亮点:

主要演示的其中三个特性,测试结果图如下

二、kotlin-stdlib-jdk7 与 kotlin-stdlib-jdk8 合并进了 kotlin-stdlib

标准库

Kotlin 1.8.0:

稳定了一些函数------Java 与 Kotlin 之间的 TimeUnit 转换、 cbrt()、 Java Optional 扩展函数。

提供可比较且可减去的 TimeMark 预览版。

包含 java.nio.file.path 的实验性扩展函数。

附赠改进了 kotlin-reflect 性能。

2.1 cbrt()函数

cbrt()函数允许您计算双精度或浮点数的实数立方根,它现在是稳定的。

bash 复制代码
fun testcbrt(){
    println("------ cbrt()函数计算双精度或浮点数的实数立方根 结果 ------")
    val num = 27
    val negNum = -num
    println("The cube root of ${num.toDouble()} is:"+ cbrt(num.toDouble()))
    println("The cube root of ${negNum.toDouble()} is:"+ cbrt(negNum.toDouble()))
}

运行结果

2.2 Java 与 Kotlin 之间的 TimeUnit 转换

kotlin中的toTimeUnit()和toDurationUnit()函数。时间现在稳定了。这些功能在Kotlin 1.6.0中作为实验版本引入,提高了Kotlin与Java之间的互操作性。

现在您可以轻松地在Java Java .util.concurrent. timeunit和Kotlin Kotlin .time. durationunit之间进行转换。这些函数仅在JVM上受支持。

bash 复制代码
// For use from Java
fun wait(timeout: Long, unit: TimeUnit) {
    val duration: Duration = timeout.toDuration(unit.toDurationUnit())
    println("java timeout = $timeout $unit 使用 kotlin 转换后 duration = $duration")
}


fun main(){
    testcbrt()
    println("------ Java 与 Kotlin 之间的 TimeUnit 转换 ------")
    wait(1, TimeUnit.HOURS)
    wait(1, TimeUnit.MINUTES)
    wait(60, TimeUnit.MINUTES)
    wait(3, TimeUnit.SECONDS)
    wait(60, TimeUnit.SECONDS)
    wait(1000, TimeUnit.MILLISECONDS)
    wait(1000, TimeUnit.MICROSECONDS)

}

运行结果

2.3 可比较可减去的 TimeMark

在Kotlin 1.8.0之前,如果您想计算多个TimeMark与现在之间的时间差,那么一次只能对一个TimeMark调用elapsedNow()。 这使得比较结果变得困难,因为两个elapsedNow()函数调用不能完全同时执行。

为了解决这个问题,在Kotlin 1.8.0中,您可以从同一时间源中减去和比较timemark。 现在可以创建一个新的TimeMark实例来表示Now,并从中减去其他TimeMark。这样,从这些计算中收集的结果就可以保证彼此是相对的。

bash 复制代码
fun testTimeMark(){
    println("------ 可比较可减去的 TimeMark ------")
    val timeSource = TimeSource.Monotonic
    var mark1 = timeSource.markNow()
    Thread.sleep(500)
    val mark2 = timeSource.markNow()

    repeat(4) { n ->
        val elapsed1 = mark1.elapsedNow()
        val elapsed2 = mark2.elapsedNow()

        // Difference between elapsed1 and elapsed2 can vary depending
        // on how much time passes between the two elapsedNow() calls
        println("Measurement 1.${n + 1}: elapsed1=$elapsed1, " + "elapsed2=$elapsed2, diff=${elapsed1 - elapsed2}")
    }

    println()

    // Since 1.8.0
    repeat(4) { n ->
        val mark3 = timeSource.markNow()
        val elapsed1 = mark3 - mark1
        val elapsed2 = mark3 - mark2

        // Now the elapsed times are calculated relative to mark3,
        // which is a fixed value
        println("Measurement 2.${n + 1}: elapsed1=$elapsed1, " + "elapsed2=$elapsed2, diff=${elapsed1 - elapsed2}")
    }
    // It's also possible to compare time marks with each other
    // This is true, as mark2 was captured later than mark1
    println("mark2 > mark1 : ${mark2 > mark1}")
}

运行结果

三、kt_180.kt文件代码

bash 复制代码
package com.example.test.ktversion

import java.util.concurrent.TimeUnit
import kotlin.math.cbrt
import kotlin.time.Duration
import kotlin.time.TimeSource
import kotlin.time.toDuration
import kotlin.time.toDurationUnit

/*
    https://book.kotlincn.net/text/whatsnew18.html

    标准库
    Kotlin 1.8.0:

    稳定了一些函数------Java 与 Kotlin 之间的 TimeUnit 转换、 cbrt()、 Java Optional 扩展函数。
    提供可比较且可减去的 TimeMark 预览版。
    包含 java.nio.file.path 的实验性扩展函数。
    附赠改进了 kotlin-reflect 性能。
 */
/**
 * cbrt()函数允许您计算双精度或浮点数的实数立方根,它现在是稳定的。
 */
fun testcbrt(){
    println("------ cbrt()函数计算双精度或浮点数的实数立方根 结果 ------")
    val num = 27
    val negNum = -num
    println("The cube root of ${num.toDouble()} is:"+ cbrt(num.toDouble()))
    println("The cube root of ${negNum.toDouble()} is:"+ cbrt(negNum.toDouble()))
}

/*
    Java 与 Kotlin 之间的 TimeUnit 转换
    kotlin中的toTimeUnit()和toDurationUnit()函数。时间现在稳定了。这些功能在Kotlin 1.6.0中作为实验版本引入,提高了Kotlin与Java之间的互操作性。
    现在您可以轻松地在Java Java .util.concurrent. timeunit和Kotlin Kotlin .time. durationunit之间进行转换。这些函数仅在JVM上受支持。
 */
// For use from Java
fun wait(timeout: Long, unit: TimeUnit) {
    val duration: Duration = timeout.toDuration(unit.toDurationUnit())
    println("java timeout = $timeout $unit 使用 kotlin 转换后 duration = $duration")
}

/*
    可比较可减去的 TimeMark
    在Kotlin 1.8.0之前,如果您想计算多个TimeMark与现在之间的时间差,那么一次只能对一个TimeMark调用elapsedNow()。
    这使得比较结果变得困难,因为两个elapsedNow()函数调用不能完全同时执行。

    为了解决这个问题,在Kotlin 1.8.0中,您可以从同一时间源中减去和比较timemark。
    现在可以创建一个新的TimeMark实例来表示Now,并从中减去其他TimeMark。这样,从这些计算中收集的结果就可以保证彼此是相对的。
 */
fun testTimeMark(){
    println("------ 可比较可减去的 TimeMark ------")
    val timeSource = TimeSource.Monotonic
    var mark1 = timeSource.markNow()
    Thread.sleep(500)
    val mark2 = timeSource.markNow()

    repeat(4) { n ->
        val elapsed1 = mark1.elapsedNow()
        val elapsed2 = mark2.elapsedNow()

        // Difference between elapsed1 and elapsed2 can vary depending
        // on how much time passes between the two elapsedNow() calls
        println("Measurement 1.${n + 1}: elapsed1=$elapsed1, " + "elapsed2=$elapsed2, diff=${elapsed1 - elapsed2}")
    }

    println()

    // Since 1.8.0
    repeat(4) { n ->
        val mark3 = timeSource.markNow()
        val elapsed1 = mark3 - mark1
        val elapsed2 = mark3 - mark2

        // Now the elapsed times are calculated relative to mark3,
        // which is a fixed value
        println("Measurement 2.${n + 1}: elapsed1=$elapsed1, " + "elapsed2=$elapsed2, diff=${elapsed1 - elapsed2}")
    }
    // It's also possible to compare time marks with each other
    // This is true, as mark2 was captured later than mark1
    println("mark2 > mark1 : ${mark2 > mark1}")
}

fun main(){
    testcbrt()
    println("------ Java 与 Kotlin 之间的 TimeUnit 转换 ------")
    wait(1, TimeUnit.HOURS)
    wait(1, TimeUnit.MINUTES)
    wait(60, TimeUnit.MINUTES)
    wait(3, TimeUnit.SECONDS)
    wait(60, TimeUnit.SECONDS)
    wait(1000, TimeUnit.MILLISECONDS)
    wait(1000, TimeUnit.MICROSECONDS)
    testTimeMark()
}
相关推荐
charlie11451419111 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满11 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
ELI_He99918 分钟前
PHP中替换某个包或某个类
开发语言·php
m0_7482361125 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
倔强的石头10633 分钟前
【C++指南】类和对象(九):内部类
开发语言·c++
Watermelo61738 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Evand J3 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB3 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
Ronin3053 小时前
11.vector的介绍及模拟实现
开发语言·c++