为有牺牲多壮志,敢教日月换新天。

[Kotlin参考]一、总览-(9)1.2新增功能

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(let_us_code)
➤博主域名:https://www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/12152311.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

Kotlin 1.2的新增功能

目录

多平台项目(实验性)

多平台项目是Kotlin 1.2 中的一项新的实验性功能,可让您在Kotlin支持的目标平台(JVM,JavaScript和(将来)本机)之间重用代码。在多平台项目中,您具有三种模块:

  • 一个常见的模块包含的代码不特定于任何平台上,以及声明没有实现依赖于平台的API。
  • 平台模块包含的针对特定平台公共模块在依赖于平台的声明,以及其它依赖于平台的代码实现。
  • 常规模块针对特定平台,并且可以是平台模块的依存关系,也可以是平台模块的依存关系。

当您为特定平台编译多平台项目时,将生成通用部分和特定于平台的部分的代码。

多平台项目支持的关键功能是可以通过预期的和实际的声明来表达通用代码对特定于平台的部分的依赖性预期的声明指定一个API(类,接口,注释,顶级声明等)。实际的声明可以是API的平台相关实现,也可以是引用外部库中API的现有实现的类型别名。这是一个例子:

通用代码:

 
 
 
 
 
//特定于平台的API:
预计 乐趣 你好世界字符串):字符串
好玩的 问候(){
    //预期API的用法:
    val  greeting  =  hello“多平台世界”
    println问候语
}
期望的  网址规范字符串){
    打开 乐趣 getHost():字符串
    打开 乐趣 getPath():字符串
}
 
 
 

在JVM平台代码中:

 
 
 
 
 
实际 有趣的 问候worldString):String  =
    “您好,$ world,在JVM平台上!”
//使用现有的特定于平台的实现:
实际的 typealias  URL  =  java网址
 
 
 

有关建立多平台项目的详细信息和步骤,请参阅文档

其他语言功能

注释中的数组文字

从Kotlin 1.2开始,注释的数组参数可以使用新的数组文字语法而不是arrayOf函数传递

 
 
 
 
 
@CacheConfigcacheNames  = [ “ books”“ default” ])
公共  BookRepositoryImpl {
    // ...
}
 
 
 

数组文字语法仅限于注释参数。

Lateinit顶级属性和局部变量

lateinit修饰符现在可以在顶级性能和使用的局部变量。例如,当作为构造函数参数传递给一个对象的lambda引用另一个必须稍后定义的对象时,可以使用后者:

 
 
 
 
 
 
 Node < T >val  Tval  next:()->  Node < T >
fun  mainargsArray < String >){
    //三个节点的循环:
    lateinit  var  third节点< Int >
    val  second  =  节点2next  = { 第三 })
    val  first  =  节点1next  = { 第二 })
    第三 =  节点3下一个 = { 第一 })
    val  节点 =  generateSequence首先){ 下一个()}
    println“周期中的值:$ {nodes.take(7).joinToString {it.value.toString()}},...”
}
 
 
 
目标平台:JVM 。运行在科特林v 61年3月1日

检查lateinit var是否已初始化

现在,您可以使用isInitialized属性参考来检查lateinit var是否已初始化

 
 
 
 
 
 
 
的println“转让前将IsInitialized:”  +  这个 :: lateinitVar将IsInitialized
lateinitVar  =  “值”
的println“转让后,将IsInitialized:”  +  这个 :: lateinitVar将IsInitialized
 
 
 
目标平台:JVM 。运行在科特林v 61年3月1日

具有默认功能参数的内联功能

现在允许内联函数为其内联函数参数具有默认值:

 
 
 
 
 
 
 
内联 乐趣 < E >可 迭代的< E >变换:(ë- >  字符串 = { 的toString()})=
    映射 { 变换it)}
VAL  defaultStrings  =  listOf123)。字串()
VAL  customStrings  =  listOf123)。字符串 { “($ it)” }
 
 
 
目标平台:JVM 。运行在科特林v 61年3月1日

来自显式强制转换的信息用于类型推断

Kotlin编译器现在可以在类型推断中使用来自类型转换的信息。如果您正在调用一个返回类型参数的泛型方法,并将T返回值转换为特定类型Foo,则编译器现在可以理解,T此调用需要绑定到该类型Foo

这对于Android开发人员尤其重要,因为编译器现在可以正确分析findViewByIdAndroid API级别26中的通用 调用:

 
 
 
 
 
VAL  按钮 =  findViewByIdřID按钮作为 按钮
 
 
 

精巧的演员表改进

当从安全调用表达式中分配了一个变量并检查是否为空时,智能转换现在也将应用于安全调用接收者:

 
 
 
 
 
 
 
val  firstChar  =s   CharSequencefirstOrNull()
如果firstChar  !=  null
返回 scount { it  ==  firstChar } // s:将任何内容智能转换为CharSequence
val  firstItem  =s   Iterable <*>firstOrNull()
如果firstItem  !=  null
返回 scount { it  ==  firstItem } // s:将任何内容智能转换为Iterable <*>
 
 
 
目标平台:JVM 。运行在科特林v 61年3月1日

此外,现在允许仅在lambda之前修改的局部变量使用lambda中的智能转换。

 
 
 
 
 
 
 
val  flag  =  args大小 ==  0
var  x字符串 =  
ifflagx  =  “雅虎!”
运行 {
    如果x  !=  null){
        的printlnX长度// x是智能浇铸到字符串
    }
}
 
 
 
目标平台:JVM 。运行在科特林v 61年3月1日

支持:: 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参数传递单个项目请使用扩展运算符和相应的数组工厂函数:

 
 
 
 
 
foo项目 =  * intArrayOf1))
 
 
 

在这种情况下,有一项优化措施可以消除冗余阵列的创建,从而防止性能下降。单参数形式在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-jre7kotlin-stdlib-jre8

从Kotlin的角度来看,新工件中的声明在相同的程序包名称下可见,但对于Java具有不同的程序包名称。因此,切换到新工件将不需要对源代码进行任何更改。

确保与新模块系统兼容的另一项更改是kotlin.reflectkotlin-reflect库中删除软件包中不推荐使用的声明如果您使用它们,则需要切换到使用kotlin.reflect.full包中的声明,该声明自Kotlin 1.1开始受支持。

开窗的,分块的,zipWithNext

为新的扩展Iterable<T>Sequence<T>以及CharSequence覆盖这样的用例如缓冲或批处理(chunked),滑动窗口和计算滑动平均(windowed),和处理后续的项目对(zipWithNext):

 
 
 
 
 
 
 
val  项目 =1 .. 9)。地图 { it  *  it }
val  chunkedIntoLists  =  项目大块4
val  points3d  =  项目分块3){(xyz->  Triplexyz)}
val  windowed  =  项目开窗的4
val  slideAverage  =  项目窗口4){ 平均()}
val  pairwiseDifferences  =  项目zipWithNext { ab-  >  b  -  a }
 
 
 
目标平台:JVM 。运行在科特林v 61年3月1日

填充,替换全部,随机/随机播放

用于操纵列表中加入一组扩展函数:fillreplaceAllshuffleMutableList,和shuffled用于只读List

 
 
 
 
 
 
 
val  项目 =1 .. 5)。toMutableList()
项目随机播放()
println“随机项目:$ items”
项目replaceAll { it  *  2 }
println“项目加倍:$ items”
项目填满5
println“填充了5个项目:$ items”
 
 
 
目标平台:JVM 。运行在科特林v 61年3月1日

kotlin-stdlib中的数学运算

为了满足长期的要求,Kotlin 1.2添加了kotlin.mathJVM和JS通用的数学运算API,其中包含以下内容:

  • 常数:PIE;
  • 三角函数:cossintan和逆其中:acosasinatanatan2
  • 双曲:coshsinhtanh和它们的反:acoshasinhatanh
  • 求幂:pow(扩展函数), ,sqrthypot ;expexpm1
  • 对数:loglog2log10lnln1p
  • 四舍五入:
    • ceilfloortruncateround(半连)的功能;
    • roundToIntroundToLong(半数到整数)扩展功能;
  • 符号和绝对值:
    • abssign功能;
    • absoluteValuesign扩展属性;
    • withSign 扩展功能;
  • maxmin两个值;
  • 二进制表示形式:
    • ulp 扩展属性;
    • nextUpnextDownnextTowards扩展函数;
    • toBitstoRawBitsDouble.fromBits(这些是在kotlin包)。

相同的函数集(但没有常量)也可用于Float参数。

BigInteger和BigDecimal的运算子和转换

Kotlin 1.2引入了一组函数,用于与其他数字类型一起操作BigInteger以及BigDecimal从其他数字类型创建它们。这些是:

  • toBigIntegerIntLong;
  • toBigDecimalIntLongFloatDouble,和BigInteger;
  • 算术和按位运算符函数:
    • 二元运算符 +-*/%和缀功能andorxorshlshr
    • 一元运算符-++--,和功能inv

浮点到位转换

转换增加了新的功能Double,并Float以从他们的位表示:

  • toBitstoRawBits返回LongDoubleIntFloat;
  • Double.fromBitsFloat.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!返回不正确truex为空。从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基本数组(例如IntArrayDoubleArray)转换为JavaScript类型数组(以前是选择加入功能),默认情况下已启用。

工具类

警告为错误

编译器现在提供了将所有警告视为错误的选项。使用-Werror命令行,或以下摇篮片段上:

 
 
 
 
 
compileKotlin {
    kotlinOptionsallWarningsAsErrors  =  true
}
 
 
posted @ 2020-01-05 14:10  为敢技术  阅读(350)  评论(0编辑  收藏  举报