Kotlin知识点总结

103 阅读6分钟

前言

近些工作需要学习Kotlin,而且作为Android开发不了解Kotlin已经很out了,后续会持续输出Kotlin学习中总结的一些知识点。

image.png

内容

  1. Class默认是final,如果需要集成,用open修饰
  2. Class的方法默认也是final,如果需要重写,用open修饰
  3. 继承使用:SuperClassName(),表示调用父类默认构造方法
  4. 继承方法、属性用override关键字
  5. 当想用带参数的构造函数构造子类,那么需要父类提供带参数的构造函数声明。
  6. When替代别的语言用到的switch关键字,第一个满足条件的判断被执行,when判断逻辑里一般要有else语句,假如所有条件把情况全部包含,就不需要else关键字了
  7. loop循环支持for(item in items)、while、do-while循环关键字
  8. 类可以自定义自己的迭代器,operator fun iterator(): Iterator {return T.iterator()},返回的迭代器的类必须实现next、hasNext方法
  9. 范围range:in(闭区间)、until(开区间)、setp(闭区间)、downTo(闭区间),这些关键字适用于for、if等,而且同时支持数字、字符等的遍历
  10. Kotlin 使用 == 进行结构比较,使用 === 进行引用比较
  11. 条件表达式:没有condition?then:else,用if-else替代,if(condition) then else another
  12. 特殊类:data class,默认派生equal、hashCode、toString、componentN(1、2、3、4…)、copy等方法,子类如果修改需要override,其中hashCode跟对象内的数据有关,如果数据一致则为同一个obj
  13. 特殊类:enum class,enum类可以带参数和方法
  14. 特殊类:sealed class,需要继承的子类必须在同一个包内
  15. 特殊类:object,没有类、没有构造函数、只有一个lazy实例,只在第一次调用的时候初始化,可以理解为结构体(比结构体还要简单);object有个特殊用法是companion object,语法上类似java里的static关键字,可以通过名称直接调用方法。
  16. 高阶函数(higher-order functions):把别的函数作为参数并且/或者作为返回值的方法。
  17. ::fun在kotlin里表示方法的引用。
  18. Lambda表达式:一种更加简单创建方法的方式;具有隐式的it变量;lambda是包含在花括号{}内的;具有内、外类型推断的能力,内部可以智能推断表达式的返回值、外部可以智能推荐表达式的类型,内外类型推断没法同时使用。
  19. 扩展方法、扩展属性:class.fun = …/class.property = …,需要指定扩展的类型。
  20. 集合:List,MutableList,可以用listOf或mutableListOf生成。
  21. 集合:Set,MutableSet,不可重复集合,不保证顺序,可以用setOf或mutableSetOf生成。
  22. 集合:Map,MutableMap,可以用mapOf、mutableMapOf生成,生成过程可以用infix(中缀表达式)to来表示。
  23. 集合操作:filter,按照表达式规则过滤,Collections.filter{},花括号里支持lambda表达式。
  24. 集合操作:map,按照表达式规则遍历,Collections.map{},花括号里支持lambda表达式。
  25. 集合操作:any,按照表达式规则只要任一一个元素满足就返回true,Collections.any{},花括号里支持lambda表达式。
  26. 集合操作:all,按照表达式规则所有元素都满足返回true,Collection.all{},花括号里支持lambda表达式。
  27. 集合操作:none,按照表达式规则没有一个元素满足返回true,否则false,Collections.none{},花括号里支持lambda表达式。
  28. 集合操作:find、findLast,按照表达式规则返回从头第一个或者从尾加载第一个满足条件的元素,Collections.find{},Collections.findLast{}。
  29. 集合操作:first、last,返回第一个或者最后一个元素、也可以按照表达式规则返回第一个或者最后一个元素。
  30. 集合操作:firstOrNull、lastOrNull,规则同first、last,如果未找到元素则返回null。
  31. 集合操作:count,返回元素个数、按照表达式规则返回元素个数。
  32. 集合操作:associateBy、groupBy,按照规则筛选数据,返回一个map,associateBy把最后一个合适的元素作为value。
  33. 集合操作:partition,按照规则将原collection分割为一系列的list,一组是满足条件的list,一组是不满足条件的list。
  34. 集合操作:flatMap,按照规则将多个list打平成一个。
  35. 集合操作:minOrNull、maxOrNull,返回最小、最大值,若没有返回null。
  36. 集合操作:sort(自然排序,升序)、sortBy、sortedDescending、sortedByDescending,排序。
  37. 集合操作:[],对于map来说,可以直接map[“key”]访问value。
  38. 集合操作:zip,A zip B或者A.zip(B){lambda},将两个list合并成一个list,每个item是一个pair,是由两个list对应下标的两个元素组成,组成规则可以用lamdda自定义。
  39. 集合操作:getOrElse,获取数据若超过下标或者不存在,返回默认值,list.getOrElse(index){}、map.getOrElse(key){}。
  40. 作用域函数:let、run,功能类似,都会返回Lambda的执行结果,区别在于let有Lambda参数,而run没有。但run可以使用this来访问user对象里面的公开属性和函数。
  41. 作用域函数:also、apply,功能类似,都是返回当前执行的对象,also有Lambda参数(这里的Lambda参数就是当前执行的对象),而apply没有Lambda参数(而是通过this来访问当前执行的对象)。
  42. 作用域函数:with,with的Lambda内部没有参数,而是可以通过this来访问传入对象的公开属性和函数。
  43. 代理模式:by,A by B,将A对象相应的调用委托给B。
  44. 提效开发:解构声明、String模版、智能推断。
  45. 语法糖:当函数的最后一个参数是 lambda 表达式时,可以将 lambda 写在括号外。这就是它的闭包原则。
  46. SAM:如果一个接口里只有一个方法,那么该接口实现的地方可以直接替换成一个lambda表达式,Thread(object:Runnable{override fun run(){xxxx}}) 可以直接替换为Thread{xxxxx}
  47. 新运算符::?,如果实例为空则返回右边的表达式,常用来对象判空简写。  A ?: return
  48. 新运算符:!!,通知编译器不做判空检验。
  49. Lazy{}:用于懒加载,既是初始化方案已确定,知识使用的时候执行;而且修饰的只能是val常量;lazy修饰的变量可以直接使用,不用担心NPE;Lazy接口默认mode是LazyThreadSafetyMode.SYNCHRONIZED,默认实现是SynchronizedLazyImpl,用volatile修饰,还有LazyThreadSafetyMode.PUBLICATION,内部采用synchronized的CAS机制,还有LazyThreadSafetyMode.NONE,线程不安全;Lazy内部通过同步锁和双重校验的方式返回持有的实例。
  50. LateInit:非空类型可以使用lateinit达到延迟初始化,如果使用前没有初始化会Exception,防止Exception,可以再使用前通过::xxx.isInitialized来判空。
  51. 语法糖:a()直接跟参数,会调用a的invoke方法。
  52. 下划线:_,可以作为lambda或者解构结构中不会用到的参数。例如:map.foreach {key,value->print(“value”)}其中key没用,可改写成map.foreach{_,value->print(“value”)}