1.if-else语句
基本用法和c语言一样,但如果每个分支内部只有一个字符串返回值,此时可以去掉大括号。示例:
if (isTrue==true) "真" else "假"
2.多路分支when/else
与switch/case的区别:
<1>关键字switch被when取代;
<2>判断语句“case 常量值:”被新语句“常量值 ->”取代;
<3>取消break,关键字default被else取代。
when (count) {
0 -> tv_answer.text = "000000000"
1 -> tv_answer.text = "111111111"
else -> tv_answer.text = "-1"
}
//允许有返回值
tv_answer.text = when (count) {
0 -> "000000000"
1 -> "111111111"
else -> "-1"
}
//允许接收变量
var zero:Int = 0
var one:Int = 1
tv_answer.text = when (count) {
odd -> "000000000"
even -> "111111111"
else -> "-1"
}
此外,多个常量值共用一个分支时,并排在一起并用逗号隔开即可。如果几个常量值刚好是连续数字,可以使用“in 开始值..结束值”指定区间范围,如果不在某个区间范围,则使用语句“!in 开始值..结束”。
tv_answer.text = when (count) {
1,3,5,7,9 -> "凉风有信的谜底是"讽""
in 13..19 -> "秋月无边的谜底"二""
!in 6..10 -> "当里的当,少侠你来猜猜"
else -> "这是一首好诗"
}
3.类型判断
关键字instanceof被is取代,下面是类型判断的Kotlin代码格式:
if (str is String){...}
同时多路分支的when/else也支持类型判断,只不过在分支判断时采取“is 变量类型 ->”这种形式。
示例:
tv_answer.text = when (countType) {
is Long -> "此恨绵绵无绝期"
is Double -> "树上的鸟儿成双对"
else -> "门泊东吴万里船"
}
4.循环处理
4.1for-in循环
采用“for(item in list)”形式进行循环操作
var poem =""
for (item in poemArray) {
poem = "$poem$item,\n"
}
数组循环采用““for (i in 数组变量.indices)”语句,其中indices表示该数组变量的下标数组,示例:
var poem:String=""
//indices表示数组变量对应的下标数组
for (i in poemArray.indices) {
if (i%2 == 0) {
poem = "$poem${poemArray[i]},\n"
} else {
poem = "$poem${poemArray[i]}。\n"
}
}
tv_poem_content.text = poem
其他for循环形式:
// 左闭右开区间,合法值包括11,但不包括66
for (i in 11 until 66) { ... }
// 每次默认值递增1,这里改为每次递增4
for (i in 23..89 step 4) { ... }
// for循环默认递增,这里改为默认递减
for (i in 50 downTo 7) { ... }
4.2条件循环
while循环和Java一样
//while循环
while (i < poemArray.size) {
if (i%2 ==0) {
poem = "$poem${poemArray[i]},\n"
} else {
poem = "$poem${poemArray[i]}。\n"
}
i++
}
//do while循环
do {
if (i%2 ==0) {
poem = "$poem${poemArray[i]},\n"
} else {
poem = "$poem${poemArray[i]}。\n"
}
i++
} while (i < poemArray.size)
4.3跳出多重循环
continue和break都保留Java的用法,但Kotlin还可以跳出多重循环。跳出外层循环需要加个@标志。示例:
//给外层循环加个outside的标志
outside@ while (i < poemArray.size) {
var j:Int = 0
var item = poemArray[i];
while ( j < item.length) {
if (item[j] == '') {
is_found = true
//直接跳出outside循环
break@outside
}
}
j++
}
5.空安全
Kotlin 校验字符串空值的几个方法
<1>isNullOrEmpty:空指针或者字符串长度为0时返回true,非空串与可空串均可调用;
<2>isNullOrBlank:空指针或字符串长度为0或全为空格时返回true,非空串与可空串均可调用;
<3>isEmpty:字符长度为0时返回true,只有非空串可调用;
<4>isBlank:字符长度为0或者全为空格时返回true,只有非空串可调用;
<5>isNotEmpty:字符串长度不为0时返回true,只有非空串可调用;
<6>isNotBlank:字符串长度不为0且不是全空格串时返回true,只有非空串可调用。
5.1声明可空变量
声明一个可空字符串
var strCanNull:String?//可空字符串需要进行非空判断,否则编译器会提示代码错误
var strNotNull:String//该变量值不能为null,否则编译器会提示代码错误
5.2检验空值的运算符
示例加用法说明:
var length_null:Int?
val strB:String? = null
btn_question_dot.setOnClickListener {
//?.表示变量为空时直接返回null,所以返回值的变量必须被声明为可空类型
length_null = strB?.length
tv_check_result.text = "使用?.得到字符串B长度为$length_null"
}
btn_question_colon.setOnClickListener {
//?:表示为空时返回右边的值,即(x!=null)?x.**:y
length = strB?.length?: -1
tv_check_result.text = "使用?:得到字符串B的长度为$length"
}
btn_exclamation_two.setOnClickListener {
strB = "排雷完毕"
//!!.强行把strB变量从可空类型转换为非空类型,从而避免非空检验
length = strB!!.length
tv_check_result.text = "使用!!得到字符串B的长度为$length"
}
btn_exclamation_two.setOnClickListener {
//!!.表示不做非空判断,强行执行后面的表达式,如果变量为空,就抛出异常
//只有确保非空时,才能使用!!,不然使用要catch异常
try {
length = strB!!.length
tv_check_result.text = "使用!!得到字符串B的长度为$length"
}catch(e:Exception) {
tv_check_result.text = "发现空指针"
}
}
6.等式判断
6.1比较两个字符串相等用“==”,同理,两个字符串不等用“!=”
6.2引用相等---除了值相等外,还要求引用的地址也相等
判断引用相等用“===”表示,同理,不等用“!==”表示
6.3 s和in
运算符is和!is---是否为某种类型
val oneLong:Long = 1L
val result = oneLong is Long//result结果是布尔值
运算符in和!in---判断数组是否存在等值元素
val oneArray:IntArray = intArrayOf(1, 2, 3, 4, 5)
val four:Int = 4
val result = four in oneArray//result值为布尔值