记录一些速查的kotlin高频函数和API,省的太久不写忘了
定义约定
常量
1
   | val Name : Type = initVal
   | 
 
变量
var Name : Type = initVal
函数
1 2 3
   | (override... 修饰符) fun Name (para:paraType = deafultVal) : return Type{      }
  | 
 
可为null
1 2 3 4 5 6 7 8 9
   | val Name : Type? = initVal/null
 
  Name!!.member                               
  val Name : Type = null?:deafultVal
 
   | 
 
类
1 2 3 4 5 6 7 8 9 10 11
   | 
 
 
  (open) class Name(val member:Type,...) : FatherClassConstructor(para),interface{     val member = initVal     get()     set()           constructor(para):this(para) }
 
  | 
 
修饰符
1 2 3 4 5 6
   | class ClassName(){     public val member1      private val member2      protected val member3      internal val member4  }
  | 
 
定义委托
1 2 3
   | var Name by delegateObject
 
 
   | 
 
储存函数
1 2 3 4 5 6 7
   | fun myFunc(){     ... }
  fun main(){     val FunctionVal = ::myFunc  }
  | 
 
lambda
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | val Name:(paraType) -> returnType = {     para -> body
 
 
 
 
  myFunc(1,2){     x,y -> x+y }
  }
  val 
  | 
 
函数数据类型约定
1
   | (paraType1,ParaType2...) -> returnType
   | 
 
泛型(模板类)约定
1 2 3 4 5
   | class tempClass<T>(val para:Type,val tempPara:T){
  } val Name = tempClass<Int>(para1,2)
 
  | 
 
枚举类约定
1 2 3 4 5 6 7
   |  enum class Name{     enumName1,enumName2 }
  val enumNum:Name = Name.enumName1
 
 
  | 
 
数据类约定
1 2 3 4
   | data class Name(val value1:Type,val value2:Type...){ }
 
 
  | 
 
单例对象约定
1 2 3
   | object Name{ } 和类相同,但是全局只存在一个实例,且无须自己创建,必须在定义时就初始化
  | 
 
定义拓展属性
1 2 3 4 5 6 7 8
   |  val typeName.extendPropertyName : dataType get()
  fun typeName.extendFunctionName(para...) : returnType{
  }
 
 
  | 
 
接口
1 2 3 4 5
   | interface InterfaceName{     val member:Type     fun function(para):return Type      }
  | 
 
分支约定
if-else
1 2 3 4 5 6
   | if(condition){
  } else{
  }
  | 
 
when
1 2 3 4 5 6
   | when(para){     condition1 -> {body1}     condition2 -> {body2}     .....
  }
  | 
 
特殊约定
分支,lambda返回值
分支,lambda的最后一个表达式的值会作为整个结构的返回值
1 2 3 4 5 6 7 8 9
   | x= if(true){     "1" } else{     "0" }
 
  x={2} 
  | 
 
字符串中嵌入表达式
使用${}向字符串嵌入表达式
帮手函数
repeat(times: Int, action: (Int) -> Unit)
重复执行某一操作,传入一个lambda,有一个从0开始的迭代器参数
1 2 3 4 5 6 7 8
   | repeat(5){     it -> println(it) }
 
 
 
 
 
  | 
 
let()
1 2 3 4 5 6 7 8 9 10 11
   |  println(Obj.member1) println(Obj.member2) println(Obj.member3)
 
  Obj.let{     println(it.member1)     println(it.member2)     println(it.member3) }
 
  | 
 
let后接一个lambda函数,可以把let前的对象用it关键字简写
lambda 最后一条语句的返回值会被作为let的返回值
apply()
1 2 3 4 5 6 7 8 9 10 11
   | Obj.apply{     this.member= ....     this.initFunc() }
  Obj.apply{     member1 = ... }.apply{     member2 = ... }.....
 
  | 
 
对目标对象做一系列操作,通过this访问目标对象,返回操作完的目标对象
forEach(action: (T) -> Unit)
forEach传入一个lambda,对目标集(List,set…)中的每一个元素执行该lambda
1 2 3 4 5
   | val test1=setOf(1,2,3,4,5)    test1.forEach{        println(it)    }
 
   | 
 
map
对一个集合使用map,会返回一个数量相同的新集合,集合中的每个元素是原集合对应元素经过map中传入的lambda函数映射后所产生的
1 2 3 4 5 6 7
   | var aList=listOf(1,2,3,4,5,6,7,8) var aAnotherList=aList.map{     it*2 } fun main() {     println(aAnotherList)  }
   | 
 
filter
与map类似返回一个新集合,filter接受一个lambda,这个lambda以集合中的单个元素为参数,如果lambda返回值为true则在新集合中保留该元素,否则不保留
1 2 3 4 5 6 7
   | var aList=listOf(1,2,3,4,5,6,7,8) var aAnotherList=aList.filter{     it%2==0 } fun main() {     println(aAnotherList)  }
   | 
 
fold()
累加器或叫求和函数,但并不局限于加法,这个函数的第一个参数是一个初始值,第二个参数是一个lambda表达式
需要确保lambda表达式的返回值和初始值的类型相同,lambda表达式接受两个参数,第一个参数被称作累加器,每次执行lambda初始值会被传进累加器,第二个参数是集合中的一个元素,用户可以自定义集合中的元素和累加器进行什么计算,最后fold会用lambda的返回值更新初始值,实现求和
1 2 3 4 5 6 7 8 9 10 11
   | var aList=listOf(1,2,3,4,5,6,7,8,9,10) var sum=aList.fold(0){     tot,cur->     val tmp=cur*2     tot+tmp }
  fun main() {     println(aList)      println(sum)  }
   | 
 
sortedBy()
返回一个集合经过排序的结果,接受一个lambda作为参数,要求lambda的返回值是可排序的(字符串或数值),会把每个元素在lambda中计算出的返回值作为排序的依据
1 2 3 4 5 6 7 8 9
   | var aList=listOf(1,2,3,4,5,6,7,8,9,10) var reversedList=aList.sortedBy{     num -> -num }
  fun main() {     println(aList)      println(reversedList)  }
   | 
 
数据管理
数组 array
1 2 3
   | val array = arrayOf<Type>(elem1,elem2,....)  println(array[0])  val arrry12 = array1+array2 
   | 
 
列表(可变长数组) list
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | val aList=listOf(1,2,true,"123")  println(aList.size)  println(aList[0])  println(aList.indexOf("123)) // 3 ,若未找到返回-1 for (elem in aList) {     // 使用 for 遍历 } anotherList=mutableListOf(1,2,true,"123") // 可修改的列表 anotherList.add("4") // [1,2,true,"123","4"] //向末尾添加元素 anotherList.add(2,"4") // [1,2,"4",true,"123","4"]  // 向中间插入 anotherList.removeAt(0) // [2,"4",true,"123","4"]   // 按下标删除 anotherList.remove("123") // [2,"4",true,"4"] // 按值删除 anotherList.contains(2) //查询是否存在 2 in anotherList // 前者的另一写法
   | 
 
集合 set
Set / mutableSet 同样 不可修/可修
1 2 3
   | val aSet=mutableSetOf("123",true,32)
 
 
  | 
 
映射 map
Map / mutableMap 同样 不可修/可修
1 2 3 4 5 6 7
   | val aMap=mutableMapOf(     "cake" to 10,     "cookie" to 5, 	true to 22 ) println(aMap["cake"]) 
 
   | 
 
Reference
https://developer.android.com/courses/android-basics-compose/course