★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(let_us_code)
➤博主域名:https://www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/12152311.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Kotlin 1.2的新增功能
目录
多平台项目(实验性)
多平台项目是Kotlin 1.2 中的一项新的实验性功能,可让您在Kotlin支持的目标平台(JVM,JavaScript和(将来)本机)之间重用代码。在多平台项目中,您具有三种模块:
- 一个常见的模块包含的代码不特定于任何平台上,以及声明没有实现依赖于平台的API。
- 甲平台模块包含的针对特定平台公共模块在依赖于平台的声明,以及其它依赖于平台的代码实现。
- 常规模块针对特定平台,并且可以是平台模块的依存关系,也可以是平台模块的依存关系。
当您为特定平台编译多平台项目时,将生成通用部分和特定于平台的部分的代码。
多平台项目支持的关键功能是可以通过预期的和实际的声明来表达通用代码对特定于平台的部分的依赖性。预期的声明指定一个API(类,接口,注释,顶级声明等)。实际的声明可以是API的平台相关实现,也可以是引用外部库中API的现有实现的类型别名。这是一个例子:
通用代码:
在JVM平台代码中:
有关建立多平台项目的详细信息和步骤,请参阅文档。
其他语言功能
注释中的数组文字
从Kotlin 1.2开始,注释的数组参数可以使用新的数组文字语法而不是arrayOf
函数传递:
数组文字语法仅限于注释参数。
Lateinit顶级属性和局部变量
该lateinit
修饰符现在可以在顶级性能和使用的局部变量。例如,当作为构造函数参数传递给一个对象的lambda引用另一个必须稍后定义的对象时,可以使用后者:
检查lateinit var是否已初始化
现在,您可以使用isInitialized
属性参考来检查lateinit var是否已初始化:
具有默认功能参数的内联功能
现在允许内联函数为其内联函数参数具有默认值:
来自显式强制转换的信息用于类型推断
Kotlin编译器现在可以在类型推断中使用来自类型转换的信息。如果您正在调用一个返回类型参数的泛型方法,并将T
返回值转换为特定类型Foo
,则编译器现在可以理解,T
此调用需要绑定到该类型Foo
。
这对于Android开发人员尤其重要,因为编译器现在可以正确分析findViewById
Android API级别26中的通用 调用:
精巧的演员表改进
当从安全调用表达式中分配了一个变量并检查是否为空时,智能转换现在也将应用于安全调用接收者:
此外,现在允许仅在lambda之前修改的局部变量使用lambda中的智能转换。
支持:: foo作为此::: foo的简写
this
现在可以在没有显式接收者(::foo
而不是)的情况下编写对成员的绑定可调用引用this::foo
。这也使可调用引用更方便在引用外部接收器成员的lambda中使用。
突破性的变化:尝试块后听起来很聪明
早些时候,Kotlin将在try
块内进行的分配用于该块之后的智能转换,这可能会破坏类型安全性和null安全性并导致运行时失败。此版本解决了此问题,使智能转换更加严格,但破坏了一些依赖于此类智能转换的代码。
要切换到旧的智能强制转换行为,请将fallback标志-Xlegacy-smart-cast-after-try
作为编译器参数传递。它会在Kotlin 1.3中弃用。
弃用:数据类覆盖副本
当从copy
具有相同功能的函数的类型派生copy
的数据类时,为该数据类生成的实现使用超类型的默认值,从而导致违反直觉的行为,或者在运行时失败(如果其中没有默认参数)超型。
导致copy
冲突的继承在Kotlin 1.2中被警告弃用,在Kotlin 1.3中将是错误。
弃用:枚举项中的嵌套类型
在枚举内部,inner class
由于初始化逻辑中的问题,已定义了一个非的嵌套类型。这会在Kotlin 1.2中引起警告,并在Kotlin 1.3中成为错误。
弃用:vararg的单个命名参数
为了与注释中的数组文字保持一致,foo(items = i)
已弃用为命名形式()中的vararg参数传递单个项目。请使用扩展运算符和相应的数组工厂函数:
在这种情况下,有一项优化措施可以消除冗余阵列的创建,从而防止性能下降。单参数形式在Kotlin 1.2中产生警告,在Kotlin 1.3中将被丢弃。
弃用:泛型类的内部类扩展Throwable
继承类型的内部类型的内部类Throwable
在抛出捕获场景中可能会违反类型安全性,因此已被弃用,在Kotlin 1.2中有警告,在Kotlin 1.3中有错误。
弃用:更改只读属性的支持字段
field = ...
不赞成通过在自定义getter中进行赋值来更改只读属性的后备字段,在Kotlin 1.2中有警告,在Kotlin 1.3中有错误。
标准图书馆
Kotlin标准库工件和拆分包
Kotlin标准库现在与Java 9模块系统完全兼容,该系统禁止拆分程序包(多个jar文件在同一程序包中声明类)。为了支持这一点,引入了新的工件kotlin-stdlib-jdk7
和kotlin-stdlib-jdk8
,它们代替了旧的kotlin-stdlib-jre7
和kotlin-stdlib-jre8
。
从Kotlin的角度来看,新工件中的声明在相同的程序包名称下可见,但对于Java具有不同的程序包名称。因此,切换到新工件将不需要对源代码进行任何更改。
确保与新模块系统兼容的另一项更改是kotlin.reflect
从kotlin-reflect
库中删除软件包中不推荐使用的声明。如果您使用它们,则需要切换到使用kotlin.reflect.full
包中的声明,该声明自Kotlin 1.1开始受支持。
开窗的,分块的,zipWithNext
为新的扩展Iterable<T>
,Sequence<T>
以及CharSequence
覆盖这样的用例如缓冲或批处理(chunked
),滑动窗口和计算滑动平均(windowed
),和处理后续的项目对(zipWithNext
):
填充,替换全部,随机/随机播放
用于操纵列表中加入一组扩展函数:fill
,replaceAll
和shuffle
对MutableList
,和shuffled
用于只读List
:
kotlin-stdlib中的数学运算
为了满足长期的要求,Kotlin 1.2添加了kotlin.math
JVM和JS通用的数学运算API,其中包含以下内容:
- 常数:
PI
和E
; - 三角函数:
cos
,sin
,tan
和逆其中:acos
,asin
,atan
,atan2
, - 双曲:
cosh
,sinh
,tanh
和它们的反:acosh
,asinh
,atanh
- 求幂:
pow
(扩展函数), ,sqrt
,,hypot
;exp
expm1
- 对数:
log
,log2
,log10
,ln
,ln1p
, - 四舍五入:
ceil
,floor
,truncate
,round
(半连)的功能;roundToInt
,roundToLong
(半数到整数)扩展功能;
- 符号和绝对值:
abs
和sign
功能;absoluteValue
和sign
扩展属性;withSign
扩展功能;
max
和min
两个值;- 二进制表示形式:
ulp
扩展属性;nextUp
,nextDown
,nextTowards
扩展函数;toBits
,toRawBits
,Double.fromBits
(这些是在kotlin
包)。
相同的函数集(但没有常量)也可用于Float
参数。
BigInteger和BigDecimal的运算子和转换
Kotlin 1.2引入了一组函数,用于与其他数字类型一起操作BigInteger
以及BigDecimal
从其他数字类型创建它们。这些是:
toBigInteger
为Int
和Long
;toBigDecimal
为Int
,Long
,Float
,Double
,和BigInteger
;- 算术和按位运算符函数:
- 二元运算符
+
,-
,*
,/
,%
和缀功能and
,or
,xor
,shl
,shr
, - 一元运算符
-
,++
,--
,和功能inv
。
- 二元运算符
浮点到位转换
转换增加了新的功能Double
,并Float
以从他们的位表示:
toBits
和toRawBits
返回Long
的Double
和Int
为Float
;Double.fromBits
并Float.fromBits
从该位表示构建浮点数。
正则表达式现在可序列化
该kotlin.text.Regex
班已成为Serializable
现在可以在序列化的层次结构中使用。
如果可用,则Closeable.use调用Throwable.addSuppressed
在其他一些异常之后关闭资源的过程中引发异常时,该Closeable.use
函数调用Throwable.addSuppressed
。
要启用此行为,您需要具有kotlin-stdlib-jdk7
依赖项。
JVM后端
构造函数调用规范化
从1.0版开始,Kotlin支持具有复杂控制流的表达式,例如try-catch表达式和内联函数调用。根据Java虚拟机规范,此类代码有效。不幸的是,当构造函数调用的参数中存在此类表达式时,某些字节码处理工具无法很好地处理此类代码。
为了为此类字节码处理工具的用户减轻此问题,我们添加了一个命令行选项(-Xnormalize-constructor-calls=MODE
),该选项告诉编译器为此类构造生成更多类似Java的字节码。这MODE
是以下之一:
disable
(默认)–以与Kotlin 1.0和1.1中相同的方式生成字节码;enable
–为构造函数调用生成类似Java的字节码。这可以更改类的加载和初始化顺序。preserve-class-initialization
–为构造函数调用生成类似Java的字节码,以确保保留类的初始化顺序。这可能会影响应用程序的整体性能。仅当您在多个类之间共享某些复杂状态并在类初始化时对其进行更新时,才使用它。
“手动”解决方法是将具有控制流的子表达式的值存储在变量中,而不是直接在调用参数中对其求值。类似于-Xnormalize-constructor-calls=enable
。
Java默认方法调用
在Kotlin 1.2之前,针对JVM 1.6的接口成员在重写Java默认方法时会在超级调用上产生警告:Super calls to Java default methods are deprecated in JVM target 1.6. Recompile with '-jvm-target 1.8'
。在Kotlin 1.2中,存在错误,因此需要使用JVM target 1.8编译任何此类代码。
重大变化:平台类型x.equals(null)的一致行为
调用x.equals(null)
上被映射到Java基本平台类型(Int!
,Boolean!
,Short
!, ,Long!
,Float!
,Double!
)Char!
返回不正确true
时x
为空。从Kotlin 1.2开始,调用x.equals(...)
平台类型的空值会引发NPE (但x == ...
不会)。
若要返回1.2之前的行为,请将标志传递-Xno-exception-on-explicit-equals-for-boxed-null
给编译器。
重大变化:修复了通过嵌入式扩展接收器转义平台空值的问题
在平台类型的空值上调用的内联扩展函数不会检查接收器是否为空,因此将使空转义到其他代码中。Kotlin 1.2会在呼叫站点强制执行此检查,如果接收者为null,则会引发异常。
要切换到旧的行为,请将后备标志传递-Xno-receiver-assertions
给编译器。
JavaScript后端
默认启用TypedArrays支持
JS类型数组支持可将Kotlin基本数组(例如IntArray
,DoubleArray
)转换为JavaScript类型数组(以前是选择加入功能),默认情况下已启用。
工具类
警告为错误
编译器现在提供了将所有警告视为错误的选项。使用-Werror
命令行,或以下摇篮片段上: