目录
1.字符串操作
2.数字类型
3.标准函数库
(1).apply
(2).let
(3).run
(4).with
(5).also
(6).takeIf和takeUnless
1.字符串操作
indexOf():用法跟java相同
substring():字符串截取。跟java相同,但其中有一种用法是subString(range:Int)
"frenk".substring(0 until 4)
这表示截取0-4,包括0,但不包括4
split():拆分字符串。与java不同的是返回的是一个List集合,java返回的是String[],kotlin还有一种方法接收,代码:
const val NAME = "jack,wangwang,yujun"
fun splitTest() {
val (origin, dest) = Names.split(',')
println("${origin},${dest}")
}
运行结果 :jack,wangwang
这种用法origin等于List的第一个,以此类推
replace():和java用法相同,讲一个不同的方法:第一个参数是正则表达式,第二个参数是匿名函数。
fun replaceTest() {
val str1 = "The people's Republic of China."
val str2 = str1.replace(Regex("[aeiou]")) {
when (it.value) {
"a" -> "8"
"e" -> "6"
"i" -> "9"
"o" -> "1"
"u" -> "3"
else -> it.value
}
}
println(str2)
}
运行结果 :Th6 p61pl6's R6p3bl9c 1f Ch9n8.
代码逻辑比较简单,正则中的aeiou字符对应替换成86913。
字符串比较
kotlin :==检查两个字符串的字符是否匹配
kotlin :===检查两个字符是否在堆上的同一对象
java中比较的方法是equals()
forEach:遍历字符串的每个字符
fun forEachTest() {
val str = "The people's Republic of China."
str.forEach {
print("${it}*")
}
}
运行结果 :T*h*e* *p*e*o*p*l*e*'*s* *R*e*p*u*b*l*i*c* *o*f* *C*h*i*n*a*.*
2.数字类型
kotlin提供了toDoubleOrNull,toIntOrNull的安全转化函数,如果转换不了,就返回空。
Double类型格式化
val s = "$.2f".format(8.956781)
运行结果 :8.96
Double类型转Int
fun double2Int() {
//精度损失
println("损失精度" + 8.956781.toInt())
//四舍五入
println("四舍五入" + 8.956781.roundToInt())
}
运行结果 :损失精度8
四舍五入9
3.标准函数库
(1).apply
可以看作一个配置函数,你可以传入一个接收者,然后调用一系列函数来配置它以便使用,如果提供的lambda给函数执行,它回返回配置好的接收者。
fun standardFunctionApply() {
//正常使用
val file1 = File("E://asdasdasdas.txt")
file1.setReadable(true)
file1.setWritable(true)
file1.setExecutable(true)
//apply使用
val file2 = File("E://asdasdasdas.txt").apply {
setWritable(true)
setExecutable(true)
setReadable(true)
}
}
(2).let
使某个变量作用于其lambda表达式里,使用it关键字可以进行操作使用。
let和apply的区别:let会把接收者传给lambda,而apply啥都不传。在匿名函数执行完之后,apply返回当前接收者,let会返回lambda最后一行。例如
fun standardFunctionLet() {
val s = "Frenk".apply {
this + "22222"
}
val l = "Frenk".let {
it + "1111"
}
println("${s}+${l}")
}
运行结果 :Frenk+Frenk1111
我这样解释不对,但是学apply的时候我第一想法就是我想要改变它的值,那咋改呢。本身apply和let的侧重点就不同。但我想不到更好的例子
(3).run
光看作用域,run和apply差不多,但不同的是run函数不返回接收者,返回的是lambda结果。这一点和let是相同的。此外run还可以用于引用函数。举个引用函数的例子:
val s = "Frenk".run(::isTooLong)
这样s的值就是isTooLong的返回值了,当然run中还可以进行一些复杂操作
(4).with
with是run的变体,功能一样的,调用不同,调用with需要值参为第一个参数传入。
fun standardFunctionWith() {
val isTooLong = with("The people's Republic of China"){
length >= 10
}
println(isTooLong)
}
运行结果 :true
(5).also
和let功能相似,不同点在于返回。also返回接收者,let返回lambda结果。这点和apply相似。also适合针对同一原始对象。
(6).takeIf和takeUnless
takeIf:判断lambda中的条件表达式,true的话返回接收者对象,false返回空
takeUnless:与takeIf相反。true返回空,false返回接收者对象
fun standardFunctionTakeIf() {
var s = getStr().takeIf { it != null }
println(s)
var l = getStr().takeUnless { it == null }
println(l)
}
fun getStr():String? = "111"
运行结果 :111
111