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 语法糖的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin技巧与自定义语法糖

kotlin的方言(语法糖)

Kotlin 语法糖

什么是语法糖?

什么是语法糖?

vue3语法糖