Kotlin特性

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