Kotlin 1.2 有哪些新特性
来源:互联网 发布:短信群发平台软件 编辑:程序博客网 时间:2024/05/02 09:21
原文链接是《What's New in Kotlin 1.2》,下面的译文节选了“其它的语言特性”部分(“Other Language Features”)
通过注解声明数组变量
从Kotlin1.2开始,允许通过注解声明数组参数这种语法,从而取代了arrayOf函数的数组声明方式。比如下面这样:@CacheConfig(cacheNames = ["books", "default"])public class BookRepositoryImpl { // ...}可见新的数组参数声明语法依赖于注解方式。
关键字lateinit支持全局变量和局部变量
现在lateinit修饰符能够用于全局变量和局部变量了,也就是说,二者都允许延迟初始化。例如,当lambda表达式在构造一个对象时,允许将延迟初始化属性作为构造参数传过去。比如下面这样:fun test() { lateinit var x: Component val injector = inject( ..., componentProvider = { x }, ... ) x = injector.createComponent()}
检查一个延迟初始化属性是否初始化
通过访问属性的isInitialized字段,开发者现在可以检查一个延迟初始化属性是否已经初始化了。比如下面这样:class Foo { lateinit var lateinitVar: String fun initializationLogic() { //sampleStart println("isInitialized before assignment: " + this::lateinitVar.isInitialized) lateinitVar = "value" println("isInitialized after assignment: " + this::lateinitVar.isInitialized) //sampleEnd }}fun main(args: Array<String>) {Foo().initializationLogic()}
内联函数支持函数的默认参数
内联函数现在允许给它们的函数参数填写默认参数了,比如下面这样://sampleStart,第一行的it.toString()就是默认参数值inline fun <E> Iterable<E>.strings(transform: (E) -> String = { it.toString() }) = map { transform(it) }val defaultStrings = listOf(1, 2, 3).strings()val customStrings = listOf(1, 2, 3).strings { "($it)" } //是外部传入的参数值//sampleEndfun main(args: Array<String>) { println("defaultStrings = $defaultStrings") println("customStrings = $customStrings")}
根据强制转换的信息,能够推断出变量类型
Kotlin编译器现在支持通过强制转换的信息,来推断出变量类型。如果你在调用一个返回“T”的泛型方法时,试图将它的返回值“T”转换为特定类型如“Foo”,编译器现在知道这个方法调用中的“T”其实是“Foo”类型。这个对安卓开发者而言尤其重要,因为自从API26(Android7.0)开始,findViewById变成了泛型方法,然后编译器也会正确分析该方法的调用返回值。比如下面这样:
val button = findViewById(R.id.button) as Button
智能转换的改进
当一个变量为某个安全表达式(如校验非空)所赋值时,智能转换也同样运用于这个安全调用的接收者。比如下面这样:fun countFirst(s: Any): Int { //sampleStart val firstChar = (s as? CharSequence)?.firstOrNull() if (firstChar != null) return s.count { it == firstChar } // 输入参数s被智能转换为CharSequence类型 val firstItem = (s as? Iterable<*>)?.firstOrNull() if (firstItem != null) return s.count { it == firstItem } // 输入参数s被智能转换为Iterable<*>类型 //sampleEnd return -1}fun main(args: Array<String>) { val string = "abacaba" val countInString = countFirst(string) println("called on \"$string\": $countInString") val list = listOf(1, 2, 3, 1, 2) val countInList = countFirst(list) println("called on $list: $countInList")}另外,Lamba表达式同样支持对局部变量进行智能转换,前提是该局部变量只在Lamba表达式之前修改过。比如下面这样:
fun main(args: Array<String>) { val flag = args.size == 0 //sampleStart var x: String? = null if (flag) x = "Yahoo!" run { if (x != null) { println(x.length) // x被智能转换为String类型 } } //sampleEnd}
阅读全文
0 0
- Kotlin 1.2 有哪些新特性
- css3有哪些新特性
- CSS3有哪些新特性?
- html5有哪些新特性?
- j2se 有哪些新特性?
- CSS3有哪些新特性?
- html5有哪些新特性
- Java9有哪些新特性?
- HTML5有哪些新特性
- 看看Silverlight4有哪些新特性
- 看看Silverlight4有哪些新特性
- jdk1.5的新特性有哪些
- Git 2.1有哪些新特性?
- git 2.1 有哪些新特性?
- AngularJS 2.0会有哪些新特性?
- Ruby 2.0 有哪些新特性?
- C#7.0中有哪些新特性?
- Swift 3 有哪些新特性?
- Java 反射机制的应用实例
- WebService技术详解(二): CXF
- Oracle数据库修改字段类型
- Nginx简介及配置文件详解
- Thrread子类和Runnable接口的优先级问题
- Kotlin 1.2 有哪些新特性
- js根据给定日期算出星期
- Stream Player Control-流播放器控件
- C++基础学习系列--2、递归思想,内置函数,函数重载,函数模板,带默认值函数
- 仿微信游戏界面PART.1—ConstraintLayout和RecyclerView的应用
- 几种常用的PCB表面处理工艺及其优缺点和适用场景
- vue中引入mousewheel事件及其兼容性处理
- ajax中的get方式和post方式传递的参数长度
- SQL 解析