1. as是不安全的类型转换, as? 是安全的类型转换
- as : 如果被转换的对象是null,或者类型不符,会触发异常
- as? : 如果被转换的对象是null,或者类型不符,会校验并返回null
private fun <T : View> getView(@IdRes id: Int): T? {
val view: View? = viewHashMap[id]
return view as? T
}
2. Kotlin中声明枚举
enum class EnumClass1{
Instance1{
override fun f1():String{
return "Instance1"
}
},
Instance2{
override fun f1():String{
return "Instance2"
}
override fun f2():Int{
return 101
}
},
Instance3{
override fun f1():String{
return "Instance3"
}
};
abstract fun f1():String
open fun f2():Int{
return 100
}
}
3. const val
- const val 只能声明在 object 或 companion object 中
- const val 相当于静态常量 / public static final
4. 数据类
- 数据类默认提供了 setter/getter, equals, hashCode, toString, copy, componentN
- 数据类的copy是浅拷贝
- componentN的存在是为了支持'解构'
data class DataClass1(var a1: String?, val a2: Int?, val a3: String)
fun main() {
val a1: DataClass1 = DataClass1("1", 2, "3")
val a2: DataClass1 = a1.copy()
println(a1)
println(a2)
println(a1 == a2)
println(a1 === a2)
val (at1, at2, at3) = a1
println(at1)
println(at2)
println(at3)
}
5. 方法最后1个参数是lambda表达式,可以将其写到外面.
fun main() {
val list: List<String> = listOf("1","22","333")
val result = list.filter {
it.length > 1
}
result.forEach{
println(it)
}
}
6. @JvmOverloads 用于包含默认值参数的方法
class CustomConstraintHelper1 @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintHelper(context, attrs, defStyleAttr) {
@JvmOverloads
fun f1(p1:Int = 1, p2:String?, p3:Long = 100){
}
override fun updatePostLayout(container: ConstraintLayout?) {
getViews(container).forEach {
animate(it)
}
}
private fun animate(view: View) {
val alpha: ValueAnimator = ObjectAnimator.ofFloat(view, "alpha", 0.0F, 1.0F)
alpha.duration = 3000
val scale: ValueAnimator = ObjectAnimator.ofFloat(view, "scaleX", 2.0F, 1.0F)
scale.duration = 3000
alpha.start()
scale.start()
}
}
- @JvmOverloads注解可以用于 构造方法,普通方法
- 只有当方法中包含默认值的参数,才需要使用@JvmOverloads