Kotlin常用语法糖

319 阅读3分钟

参考自:Kotlin指南(三)-语法糖

1.var是kotlin保留字,用于声明变量,与之相对的是val,表明引用不可变,但可以改变对象的值。

2.kotlin用:(冒号)取代了implements和extends保留字。

3.范围使用:in,downTo,step,until

*in在。。。范围内,闭区间[1,5]

for (i in 1..5){
    println("$i 在1-5内")
}

*until在。。。范围内,在开区间[1,5),不包含5

for (i in 1 until 5){
    println(i)
}

*step设置步长,比如设置一个步长为2

for (i in 1..5 step 2){
    println(i)
}

*downTo倒序

for (i in 5 downTo 1){
    println(i)
}

4.类型检查&转换

*is判断一个对象与指定的类型是否一致

var a:Any="a"
if (a is String){
    println("a是String类型")
}

*as类型转换

//强制类型转换
var any:Any="abc"
var str:String=any as String
//使用安全转换操作符as?可以在转换失败时返回null,避免了抛出异常
var str1=null
var str2=str1 as? String

5.相等性判断,==,===

// 设置一个类如下
data class User(var name: String, var age: Int)

// 设置值
var a = User("Czh", 22)
var b = User("Czh", 22)
var c = b
var d = a

// 对比两个对象的结构
if (c == d) {
    println("a 和 b 结构相等")
} else {
    println("a 和 b 结构不相等")
}

// 对比两个对象的的引用
if (c === d) {
    println("a 和 b 引用相等")
} else {
    println("a 和 b 引用不相等")
}

// 输出结果:
ab 结构相等
ab 引用不相等

6.空安全

/**
 *  1. 可空类型与非空类型
 *  在Kotlin中,有两种情况最可能导致出现NullPointerException
 **/

// 情况1:显式调用 throw NullPointerException()
// 情况2:使用!! 操作符
// 说明:!!操作符将任何值转换为非空类型,若该值为空则抛出异常
var a = null
a!!
// 抛出KotlinNullPointerException

// 情况3:数据类型不能为null
// 在 Kotlin 中,类型系统区分一个引用可以容纳 null (可空引用) 和 不能容纳(非空引用)
// 如:String类型变量不能容纳null
// 若要允许为空,可声明一个变量为可空字符串:在字符串类型后面加一个问号?
对于String,则是写作:String?
var b: String? = "b"
b = null

/**
 *  2. 安全调用操作符
 *  作用:表示如果若不为null才继续调用
 **/
 b?.length
 // 表示:若b不为null,才调用b.length

 // 注:安全调用符还可以链式调用
 a?.b?.c?.d
 // 假设a不为null,才继续往下调用,以此类推
 // 若该链式调用中任何一个属性为null,整个表达式都会返回null。
 // 若只对非空值执行某个操作,可与let一起使用
a?.b?.let { println(it) }

7.延迟初始化

描述:在kotlin中,成员变量的值被严格限制为可空和非可空,其中非可空的变量值,要么在声明的时候进行初始化,要么通过延迟加载的方法进行初始化,一般来说,有两种方法进行延迟加载.
*lazy:通过lazy函数,在首次使用的时候初始化.

private val xxxxFragment by lazy {
    XXXXFragment().apply {
        arguments = Bundle().apply {
        }
    }
}

*lateinit:自己控制变量的初始化.

private lateinit var iv: ImageView

*两种方式的使用场景:by lazy修饰val的变量,lateinit修饰var的变量,且变量是非空的类型.

8.object

描述:定义一个类,并创建该类的实例.
*创建一个单例

object Singleton {
    fun xxx() {
    }
}

*通过object代替匿名内部类

viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
    override fun onPageScrollStateChanged(state: Int) {}

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

    override fun onPageSelected(position: Int) {}
});

*companion object:由于在kotlin中没有静态函数,所以在kotlin中可以使用companion object替代java中的static修饰.编译器会自动生成一个叫做companion的静态内部类.
在Java中调用伴生对象,可以使用User.Companion.isMale(1)

class User {
    companion object {
        const val DEFAULT_USER_AGE = 30
    }
    fun test(){}
}
// later, accessed like you would a static variable:
user.age = User.DEFAULT_USER_AGE