Kotlin 语法糖
Posted danfengw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()
以上是关于Kotlin 语法糖的主要内容,如果未能解决你的问题,请参考以下文章