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"