0
点赞
收藏
分享

微信扫一扫

Kotlin 语法糖


1、变量声明不推荐使用 lateinit 和!!(容易空指针)

// good

var tv: TextView? = nulltv?.text = ""

// bad

lateinit var tv: TextViewtv!!.text = ""

2、可空参数与返回 + 类型转换

// 可空参数与返回

fun init(name: String?, age: Int?):String? {

}



// 类型转换 as?

// Good

(context as? Activity)?.finish() //如不满足转换条件前半部分为null

// Not Good
(context as Activity).finish() //使用强制转换可能发生 ClassCastException异常

3、if、when、?: 的使用简化代码

// Okay
val color = if (isNight) Color.Black else Color.White



when (value) {
0 -> return // Okay
1 -> {
// DO SOMETHING
}

2 -> function()
// …
}



var objects: String? = null
objects ?: "str"
objects ?: return

4、?.的使用

// 两种方式

var userInfo: UserInfo? = null

tvName.text = userInfo?.userName

tvPhone.text = userInfo?.phone

// 或者

userInfo?.let {

tvName.text = userName

tvPhone.text = phone

}

5、高级特性 let 、with、 apply、run
let:返回值是函数里面最后一行,多用于避免Null判断

// very Good
var noNullValue: String = value ?: ""


// very Good
value?.let {
noNullValue = it
}



有嵌套情况下:it使用名字代替

value?.let { value ->
noNullValue = value
noNullValue?.let { noNullValue -> {
// TODO
}
}
}

输出例子:

var result = list?.let {
it.add(1)
it.add(2)
it.add(3)
}

ps: reuslt=[1,2,3]

var result = list?.let {
it.add(1)
it.add(2)
it.add(3)
"ok"
}

ps:result="ok"



Android 实践

tv = findViewById(R.id.tv)

// 避免Null 判断
tv?.let {
it.text = "Android"
it.textSize = 20f
it.setOnClickListener {
Toast.makeText(it.context, "click", Toast.LENGTH_SHORT).show()
}
}

with:也是返回最后一行,区别在于:with 不是以扩展的形式存在,而是将某个对象作为函数的参数,并且以this指代

with(tv).{
text = "文字"
setTextColor(……)
textSize = 18f
}

run:期望能跟let一样判空,又期望能跟with一样省略it的边界写法

tv?.run{
text = "文字"
setTextColor(……)
textSize = 18f
}

apply:返回该对象 (有点替换Builder设计模式的意思)

mPaint = Paint().apply {
color = color
textSize = textSize
textAlign = Paint.Align.CENTER
strokeWidth = STROKE_WIDTH
strokeCap = Paint.Cap.ROUND
}

6、函数型变量

//声明
var clickItem: (() -> Unit)? = null
//调用
setOnClickListener {
clickItem?.invoke()
}
//赋值
itemView.clickItem = {
// TODO
}
// 有参数与返回值的
var clickItem2: ((view: View) -> Boolean)? = null

setOnClickListener {

val result = clickItem2?.invoke() //result 为Boolean值

}
itemView.clickItem2 = {
true
}

7、实体类

@Parcelize
data class UserInfo(@SerializedName("name")
var name: String? = null,
@SerializedName("age")
var age: Int = 0) : Parcelable

8、扩展函数

扩数数是指在一个类上增加一种新的行为,甚至我们没有这个类代码的访问权限。

//扩展函数定义
fun TextView.isBold() = this.apply {
paint.isFakeBoldText = true
}

//扩展函数调用
activity.find<TextView>(R.id.course_comment_tv_score).isBold()

的访问权限。

补充:

单例使用object (上次分享说过的)

object ToastUtils {

fun toast(context: Context, message: String) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
}


举报

相关推荐

0 条评论