天天看点

kotlin-常用操作符1:Elvis操作符 2:类型转换as和安全转换 as?4:冒号:5:类型判断符 is多行输入符 三个双引号

1:Elvis操作符

如果 ?: 左边表达式非空,elvis操作符就会返回左边的结果,否则返回右边的结果。

请注意,仅在左侧为空的时候,右侧的表达式才会计算。

fun elvisTest(b: String?) {
    val a= b?.length ?: -1
    // 等价于 val a:Int = if( b!= null) b.length else -1
    Log.d("alen","b is${b}" + ",a is " +a)
}
           

2:类型转换as和安全转换 as?

当使用 as 转型的时候,可能会经常出现 ClassCastException。 所以,现在可以使as?安全转型,当转型不成功的时候,它会返回 null。

fun safeCast(param: Any) {

    val m: Int? = if(param is Int) param else null
    Log.d("alen","param is ${param}" + ",m is " + m)

    val n: Int? = param as? Int
    Log.d("alen","param is ${param}" + ",n is " +n)
}
           

3:kotlin空安全(Null Safety)

每一个开发人员都会遇到这样的问题:在使用某个对象时,必须得考虑这个对象是否为空。如果对象可能为空,则不得不需要写 if(object != null) 之类的代码,如果判断条件写反,或者少写了一个条件判断,应用就会在运行时出现Crash 了。于是我们千辛万苦写的代码,到头来却被各种 NullPointerException 害苦。而现在 Kotlin Null Safety 能帮助我们节省时间,脱离空指针的苦海。

Kotlin 定义变量有两种方式,可以为 Null 和不可以为 Null。在变量类型后面加?表示该变量可以为 Null。

//定义一个可以为null的变量
var name: String? = null
//定义一个不可以为null的变量,如果此时赋值为null,则会报异常
val country: String = "china"

//报错,可能为null的变量不可以直接调用其方法
//        var length: Int = name.length

//如果name为null则pass,如果name不为null则调用count()方法
var length: Int? = name?.count()

//不管name是否为null都调用count()方法,如果为null,则抛出NullPointerException
var count: Int = name!!.count()

//由于country不为null,则可以直接调用其count方法
var countryCount: Int = country.count()
           

4:冒号:

1、类型和超类型之间的冒号前要有一个空格

2、实例和类型之间的冒号前不要空格

// 定义全局变量时
var str: String? = null

// 类的继承与变量定义
class KotlinTestActivity<T : Serializable>(name: String) : Activity() {

}
           

5:类型判断符 is

检查某个实例是否是某个类型,如果判断出属于某个类型,那么判断后的分支中可以直接可当该类型使用,无需显示转换。

fun getStringLength(obj: Any): Int {

    if(obj is String && obj.length >0) {
       return obj.length
    }
    return -1;
}
           

6:范围操作符 .. 以及 in

使用 in 运算符来检查某个数字是否在指定区间内

for(i in 1..5) {
    Log.d("alen","i is " +i)
}
// 结果
// i is 1
// i is 2
// i is 3
// i is 4
// i is 5
           

downTo()函数

//区间内循环:downTo()函数
for(i in 4 downTo 1) {
    //倒序遍历
    Log.d("alen","i is " +i)
}
// i is 4
// i is 3
// i is 2
// i is 1
           

step()函数

可以进行任意数量的迭代,而不是每次变化都是1

// step()函数 可以进行任意数量的迭代,而不是每次变化都是1
for(i in 0..5 step 2) {
   Log.d("alen","i is " +i)
}
// i is 0
// i is 2
// i is 4

// 以步长为2从4到1进行循环
for(i in 4 downTo 1 step 2) {
   Log.d("alen","i is " +i)
}
// i is 4
// i is 2
           

多行输入符 三个双引号

三引号的形式用来输入多行文本,也就是说在三引号之间输入的内容将被原样保留,之中的单号和双引号不用转义,其中的不可见字符比如/n和/t都会被保留.

valstr = """
          one
          two
              """
//等价于
val str = "one\ntwo"
val str = "one"+"\n"+"two"