kotlin基础--字符串操作、数字类型、标准库函数
上次我们学习了kotlin的null安全、异常、先决条件,接下来来看看kotlin的字符串操作、数字类型、标准库函数
一、字符串操作
1.字符串截取
substring函数支持IntRange类型参数,使用until创建的范围遵循左闭右开
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支持解构语法特性:允许在一个表达式中给多个变量赋值
const val names = "张三,李四,王五"
fun main() {
val nameList = names.split(',')
val (one, two) = nameList
println(one)
println(two)
}
结果: 张三 李四
3.replace函数
替换字符串,支持正则表达式。第一个参数为正则表达式,第二个为匿名函数
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中的"=="
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函数
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
fun main() {
val num: Int? = "8.56".toIntOrNull()
println(num)
}
2.Double转Int
fun main() {
//去掉小数
var num = 8.56.toInt()
println(num)
//四舍五入
num = 8.56.roundToInt()
println(num)
}
结果: 8 9
3.格式化字符串
用习惯c/c++的sprintf的比较熟悉
fun main() {
val str = "%.2f".format(5.23578)
println(str)
}
结果: 5.24
三.标准库函数
kotlin提供的标准库函数,又进一步的提升了编写代码效率,掌握它们是使用kotlin的前提
1.apply
apply函数可以看作一个配置函数,它的作用域内可以直接使用接收者的函数,并在最后自动返回接收者
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类似,只不过最后返回的是匿名函数结果,另外标准库函数都可以执行函数引用,非常方便
fun main() {
File("D:\my book.txt").run {
//将文件内容全部读出来,最大2G
readText()
}.run(::println)//执行具名函数
}
结果(我txt里的内容): this is my book
3.with
和run一样,只不过调用方式不同,把接收者作为参数传递了,一般用的不多
fun main() {
with(File("D:\my book.txt")) {
//将文件内容全部读出来,最大2G
readText()
}.run(::println)//执行具名函数
}
4.also
和apply不同的是,also函数会把接收者作为一个参数传递给匿名函数,所以我们在匿名函数作用域里,不能直接使用接收者的函数了,要使用it来调用 also函数返回的是接收者
fun main() {
var content: String
var file: File = File("D:\my book.txt").also {
content = it.readText()
}
println(content)
}
5.let
let和also类似,不过返回的是lambda结果
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,它可以直接在对象上调用,避免了临时变量赋值的麻烦
fun main() {
File("D:\my book.txt").takeIf { it.canRead() }
?.run { readText() }
.run(::println)
}
7.takeUnless
和takeIf相反,表达式结果为true,则返回null,否则返回接收者对象,一般使用takeIf就可以了
相关文章
- Jease 2.6发布 Java开源内容框架
- JVM调优总结:反思
- JVM调优总结:调优方法
- JVM调优总结:新一代的垃圾回收算法
- JVM调优总结:典型配置举例
- JVM调优总结:分代垃圾回收详述
- JVM调优总结:垃圾回收面临的问题
- JVM调优总结:基本垃圾回收算法
- JVM调优总结:一些概念
- 用Java GUI编写的画板程序
- Java的动态绑定机制
- jOOQ 2.0.2发布 Java的ORM框架
- Java中带复选框的树的实现和应用
- Java网络编程菜鸟进阶:TCP和套接字入门
- 甲骨文与谷歌专利权之争定于今年三月开审
- Java调用C/C++编写的第三方dll动态链接库
- 集成开发环境 NetBeans IDE 7.1正式版发布
- kangle 2.7.5紧急发布 防hash碰撞攻击
- 东方通技术引领模式为国产软件“争权”
- UML中关联,组合与聚合等关系的辨析