zl程序教程

您现在的位置是:首页 >  Java

当前栏目

kotlin基础--字符串操作、数字类型、标准库函数

2023-04-18 12:32:28 时间

上次我们学习了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就可以了