上次我们学习了kotlin的null安全、异常、先决条件,接下来来看看kotlin的字符串操作、数字类型、标准库函数
一、字符串操作
1.字符串截取
substring函数支持IntRange类型参数,使用until创建的范围遵循左闭右开
代码语言:javascript复制const val title = "my day's study"
fun main() {
//'的索引
val endIndex = title.indexOf(''')
var str = title.substring(0, endIndex)
println(str)
str = title.substring(0 until endIndex)
println(str)
}
结果:
my day
my day
2.split函数
split函数返回的是一个List对象,List支持解构语法特性:允许在一个表达式中给多个变量赋值
代码语言:javascript复制const val names = "张三,李四,王五"
fun main() {
val nameList = names.split(',')
val (one, two) = nameList
println(one)
println(two)
}
结果:
张三
李四
3.replace函数
替换字符串,支持正则表达式。第一个参数为正则表达式,第二个为匿名函数
代码语言:javascript复制const val bookName = "Introduction to algorithms"
fun main() {
val encode = bookName.replace(Regex("[a-g]")) {
when (it.value) {
"a" -> "9"
"c" -> "4"
"d" -> "3"
"g" -> "6"
else -> it.value
}
}
println(encode)
}
结果:
Intro3u4tion to 9l6orithms
4.字符串比较
和Java不同,kotlin中的"=="相当于Java中的"equals","==="相当于Java中的"=="
代码语言:javascript复制fun main(){
val a = "hello"
var b = "hello "
b = b.substring(0 until b.length -1)
if(a == b)
println("内容一样")
else
print("内容不一样")
if(a === b)
println("内存地址一样")
else
print("内存地址不一样")
}
结果:
内容一样
内存地址不一样
注:为什么要用substring函数,因为kotlin在编译时会自动把一样的字符串的变量指向同一片内存
5.遍历字符串
forEach函数
代码语言:javascript复制const val bookName = "Introduction to algorithms"
fun main() {
bookName.forEach {
print("$it/")
}
}
结果:
I/n/t/r/o/d/u/c/t/i/o/n/ /t/o/ /a/l/g/o/r/i/t/h/m/s/
二.数字类型
和Java一样:
1.安全转换函数
kotlin提供了toIntOrNull这样的函数,如果不能转换,不抛出异常,而是返回null
代码语言:javascript复制fun main() {
val num: Int? = "8.56".toIntOrNull()
println(num)
}
2.Double转Int
代码语言:javascript复制fun main() {
//去掉小数
var num = 8.56.toInt()
println(num)
//四舍五入
num = 8.56.roundToInt()
println(num)
}
结果:
8
9
3.格式化字符串
用习惯c/c 的sprintf的比较熟悉
代码语言:javascript复制fun main() {
val str = "%.2f".format(5.23578)
println(str)
}
结果:
5.24
三.标准库函数
kotlin提供的标准库函数,又进一步的提升了编写代码效率,掌握它们是使用kotlin的前提
1.apply
apply函数可以看作一个配置函数,它的作用域内可以直接使用接收者的函数,并在最后自动返回接收者
代码语言:javascript复制fun main() {
//不使用apply
var file = File("D:\my book.txt")
file.setReadable(true)
var file2 = File("D:\my book.txt").apply {
//作用域内直接可以调用接收者函数
setReadable(true)
}
}
2.run
run函数和apply类似,只不过最后返回的是匿名函数结果,另外标准库函数都可以执行函数引用,非常方便
代码语言:javascript复制fun main() {
File("D:\my book.txt").run {
//将文件内容全部读出来,最大2G
readText()
}.run(::println)//执行具名函数
}
结果(我txt里的内容):
this is my book
3.with
和run一样,只不过调用方式不同,把接收者作为参数传递了,一般用的不多
代码语言:javascript复制fun main() {
with(File("D:\my book.txt")) {
//将文件内容全部读出来,最大2G
readText()
}.run(::println)//执行具名函数
}
4.also
和apply不同的是,also函数会把接收者作为一个参数传递给匿名函数,所以我们在匿名函数作用域里,不能直接使用接收者的函数了,要使用it来调用
also函数返回的是接收者
代码语言:javascript复制fun main() {
var content: String
var file: File = File("D:\my book.txt").also {
content = it.readText()
}
println(content)
}
5.let
let和also类似,不过返回的是lambda结果
代码语言:javascript复制fun main() {
var content: String = File("D:\my book.txt").let {
it.readText()
}
println(content)
}
总结下它们的区别:
函数 | 作用域 | 返回值 |
---|---|---|
let | it | lambda结果 |
aslo | it | 接收者 |
run | 接收者 | lambda结果 |
apply | 接收者 | 接收者 |
6.takeIf
takeif需要判断lambda中的结果是true还是false,如果是false返回null,为true,返回接收者,相比于if,它可以直接在对象上调用,避免了临时变量赋值的麻烦
代码语言:javascript复制fun main() {
File("D:\my book.txt").takeIf { it.canRead() }
?.run { readText() }
.run(::println)
}
7.takeUnless
和takeIf相反,表达式结果为true,则返回null,否则返回接收者对象,一般使用takeIf就可以了