构造器优化
主构造器放在类名后面
LessonViewHolder constructor(item: View)
继承父类并重写
super
方法可以:LessonViewHolder constructor(item: View) : ViewHolder(item)
。-
写成主构造器的时候,可以在
init
代码块中初始化属性。类执行属性的时候,会根据先后顺序运行,如果初始化操作在
init
之后,而init
代码块里面又用到了那个属性,就会编译报错,初始化操作要在init
之前。 如果有主构造器的时候,次级构造器要先实现主构造器。
在主构造器中加上
var
或者val
关键表示会创建var
或者val
的属性,省去了初始化操作。创建数据类可以使用data关键字,
kotlin
自动完成了数据类的equels
,toString
,copy
,hashcode
函数。
解构
data class Response(var code: Int, var message: String)
fun getResponse(): Response{
return Response(1, "ss")
}
val (code, message) = getResponse()
判断是否是null
,并设置默认值
val data = lesson.data ?: "日期待定"
如果
lesson.data
是null
的时候,就会指定一个日期待定
的默认值
判断是否是null
,并且长度大于4
:
if (user.name?.length ?: 0 < 4)
如果user.name
是null
,那么user.name.length
是null
,就会返回0,否则返回user.name.length
。然后和4
比较。
遍历集合和循环
val list = ArrayList<String>()
for (str in list){
}
list.forEach({str: String ->
})
在
kotlin
中如果参数的最后一个参数是lamda
形式,那么可以把lamda
的表达式挪到外面。如果参数只有一个lamda
表达式,也可以把()
给省略掉。
list.forEach(){
str: String -> {
}
}
list.forEach{
str: String -> {
}
}
如果在
kotlin
的lamda
表达式中,如果lamda
的传入参数只有一个,那么也可以把参数给省略掉:
list.forEach{
it -> {
}
}
如果遍历集合的时候,需要条件判断,也可以用到filter
表达式:
val newList = list.filter{ it == ”xxx“ }
循环
遍历输入0
到99
:
repeat (100){
println(it)
}
kotlin
中也有java
的for i
循环
for (i in 0 until list.size){
}
也可以利用
list.indices
返回一个区间的形式遍历
for (i in list.indices){
}
设置var
属性的set
方法是private
companion object {
lateinit var currentApplication: Context
private set
}
在kotlin
中如果一行代码返回的情况,可以直接返回
fun get(key: String?): String? = SP.getString(key, null)
设置函数参数默认值:
如果传入单参数,则使用默认值:
fun toast(message: String, dur: Int = 2){
}
为任意一个类扩展添加指定函数
fun dp2px(dp: Float): Float {
}
fun Float.dp2px(): Float{
}
val width = 6f.dp2px
因为传入的本身也是
Float
,所以传入参数也不需要了。
也可以为任意一个类添加成员属性:
val ViewGroup.firstChild: View
get() = getChildAt(0)
viewGroup.firstChild