Kotlin特性
- data class自实现函数
- getters/setters
- equal()
- hashCode()
- toString()
- copy()
- component1()/component2()
- Map相关
- val map = mapOf("a" to 1, "b" to 2, "c" to 3)
- map["key"] = value
- 范围迭代
- for(i in 1..10) --> 1到10
- 1 until 10 --> 1到9
- 1..10 step 2 --> 13579
- 10 downTo 1 --> 10到1
- 延迟属性(Lazy property)
- val p: String by lazy { // the value is computed only on first access
// compute the string
}
- 拓展函数
- 单例类
- if-not-null-else速记
- println(files?.size ?: "empty") --> 如果files为空,则返回"empty"
- val filesSize = files?.size ?: run { return someSize } --> 要通过计算来返回空值的情况则使用run{} 代码块
- ?: 就是前面为null,则选择后面
- ?.let{} 不为null时,执行后面
- 用with(instance){}代码块调用instance实例的多个方法
- 用instance.apply{}代码段配置一个实例的多个属性
- 泛型函数需要泛型类型信息
- Java : public <T> T fromJson(JsonElement json, Class<T> classOfT) throws JsonSyntaxException { ... }
- Kotlin : inline fun <reified T: Any> Gson.fromJson(json: JsonElement): T = this.fromJson(json, T::class.java)
- 可为空值的Boolean类型 : Boolean?
- Strings in Java and Kotlin
- 字符串拼接
- 使用集合项构成字符串
- 正则表达式:Regex类
- split String
- stringInstance.split()扩展函数
- SubString
- stringInstance.subStringAfter()/stringInstance.subStringAfterLast
- 分行字符串:""" xxx """ (三引号)
- Collections in Java and Kotlin
- associateBy, groupBy根据集合中选择的字段1作为key,选择字段2作为value构造Map集合。- partition根据所给条件分成两个集合
- zip合并两个集合到一个新集合
- 运算符重载
- 扁平化
- 处理嵌套集合
- map:将T类型的集合类转换为R类型的列表
- flatMap:将R类型集合的T类型集合类转换为R类型的集合
- 中缀函数:关键字infix
- 中缀函数需要满足条件
- 成员函数和扩展函数
- 只有一个参数
- 参数不接受可变数量参数且不能有默认值
- 中缀函数优先级
- 相等检查
- ==用于结构比较会调用.equals方法
- ===用于引用比较是否是相同的对象引用
- 密封类:sealed class,限制只能在同一个包内定义子类。在when表达式中使用is关键字来判断密封类哪个子类
- 双冒号“ :: ”
- 扩展函数和扩展属性
- 功能范围:Scope Function
- instance?.let{}代码块用于非空检查和返回最后一句表达式的结果,代码段中可以用it或者自定义命名代表自身
- instance?.run{}代码块和let相似,不一样的是run默认向代码块传递自身this。不需要使用it来当参数传递
- with(instance){}不是扩展函数,但可以在代码段中直接使用instance实例中的属性成员
- instance.apply{}代码块也是传递this但返回的是自身实例,在代码块中可以省略对象名来配置各个属性,一般用作初始化对象
- instance.also{}和apply很像,但传递it作为参数,代码块内可以将it作为参数调用别的函数,一般用作链式调用。
- 代理模式
- 通过by关键字将接口方法代理给别的对象:TomAraya(n:String): SoundBehavior by ScreamBehavior(n);这个例子的意思是TomAraya类实现接口SoundBehavior,并把SoundBehavior的实现代理给了ScreamBehavior类
- 代理属性
- 解构声明
- 数组解构:变量数量要和数组数量一致
- Map解构:变量1和变量2用来对于Map中的Key和Value
- Pair和Triple也可以用来解构
- data class解构
- 声明变量对应实例的字段
- data class自动定义component1()等方法可以调用用来解构
- 如果不需要某个值,可以用下划线来代替,避免编译器提示未使用
- dynamic特殊类型:关闭Kotlin的类型检查器,用于与一些无类型或者类型宽松的环境:比如JavaScript环境交互。
- JS 函数:js("...")函数可以用于嵌套在Kotlin代码中,若有返回值则返回的是dynamic类型数据
- Kotlin Basics track
- 泛型:in、out、where
- in只能作为参数传入
- out只能作为返回输出
- where用于对泛型做多种限制(继承哪些父类,实现了哪些接口等)
- 嵌套类和内部类
- 嵌套类用inner关键字标记就是内部类了,内部类持有外部类的一个对象的引用,并且可以直接使用外部类的成员。
- 匿名内部类对象用object表达式来创建,当对象是只有一个方法的接口实例可以使用lambda表达式创建。
- object表达式和声明
- object表达式
- 可以用object{}代码段声明一个不需要继承重要对象的匿名对象,只需要将它的成员写在代码段中
- object:superClass(),interface{}代码段可以用来声明一个继承父类并实现了接口的匿名对象
- 匿名对象可以用作返回值(类型会是Any(普通对象)、superType(有父类的对象))
- object声明
- object anyName {}可以作为单例模式
- companion object伴生对象
- companion object Name {}代码段;Name可以直接省略,省略之后直接用Class.Companion代替
- 尽管companion object伴生对象看起来像静态成员,但它其实也是一个实例(可以实现接口等),如果你需要在JVM中将伴生对象作为静态方法和静态属性的话需要使用@JvmStatic注解。