Kotlin一些常用小知识积累
1、在使用自定义get函数时,不要直接在不可变变量下实现(2021-11-05)
class Test() {
var str:String? = null
val text:String
get() {
println("getText")
return "text:$str"
}
}
fun main(args: Array<String>) {
val t = Test()
println("${t.text}")
t.str = "str change 1"
println("${t.text}")
t.str = "str change 2"
println("${t.text}")
}
输出:
getText
text:null
getText
text:str change 1
getText
text:str change 2
以上代码块,每次调用Test类中的text属性时都会执行get函数,且随着str改变时,val定义的text值也会变化,不符合不可变的原则。在自定义get方法时,应该使用下面的代码
class Test() {
var str:String? = null
val _text:String
get() {
println("getText")
return "text:$str"
}
val text = _text
}
fun main(args: Array<String>) {
val t = Test()
println("${t.text}")
t.str = "str change 1"
println("${t.text}")
t.str = "str change 2"
println("${t.text}")
}
输出:
getText
text:null
text:null
text:null
2、Kotlin中断forEach循环(2021-12-21)
看下面示例
fun main() {
val list = arrayOf("123456", "abcdef", "啊哦呃噫唔吁")
list.forEach {
if(it == "abcdef") {
return@forEach
}
println("item=$it")
}
}
输出:
item=123456
item=啊哦呃噫唔吁
在这里的代码中,“return@forEach”表示仅结束本次循环,跟Java中的continue是一样的意思。如果使用“return”会直接将main方法结束,很明显是不可以的。
这里要只中断forEach,可以用代码块包裹forEach,然后结束代码块,示例如下:
fun main() {
val list = arrayOf("123456", "abcdef", "啊哦呃噫唔吁")
// 将forEach放在run方法中执行
run{
list.forEach {
if(it == "abcdef") {
return@run
}
println("item=$it")
}
}
// 使用循环遍历
for(text in list) {
if(text == "abcdef") {
break
}
println("item=$text")
}
println("end")
}
输出:
item=123456
item=123456
end
上面的示例将foreach放在run方法中执行,然后要中断时,直接结束run方法可以达到中断foreach的目的。下面的是使用遍历循环,可以直接使用break跳出,就不多说了。
中断forEach的方法在when代码块中同样适用。像在Java的switch中可以直接使用break跳出switch语句,在when中却无法实现这样的方便,所以也可以将when放在run方法中执行,然后结束run方法达到跳出when的目的,示例与run+forEach类似