Kotlin学习笔记基础篇三之字符串与内置函数

224 阅读3分钟

1、Kotlin非空断言操作符

kotlin在空判断的补救措施?if !!

fun main() {
    var name: String? = null

    //name.capitalize()//name可为空,需要自己补救

    //补救措施 ? !! ,其中 !!是断言不为null,无法保证使用?
    val r = name!!.capitalize() // 不管name是不是null都执行。 和Java一样
    println(r)

    //if的补救措施和java一样
    if (name != null) {
        val r = name!!.capitalize()
    } else {
        println("name is null")
    }

}

2、Kotlin 空合并操作符

//TODO Kotlin 空合并操作符

fun main() {
    var info: String? = "李小龙"

    info = null

    // xxx?:为null 会执行后面得
    println(info ?: "原来你是空的")

    //let + 空合并操作符

    //it代表info本身
    println(info?.let { "[$it]" } ?: "原来你是空")


}

3、Kotlin中异常处理与自定义异常特点

fun main() {
    try {
        var info: String? = null
        checkException()
        println(info!!.length)
    } catch (e: java.lang.Exception) {
        println("e:$e")
    }

}

fun checkException(info: String?) {
    TODO("Not yet implemented")
    info ?: throw CustomException()
}

class CustomException : IllegalArgumentException("你的代码不严谨")

展示了自定义异常,与平时的异常处理和打印

4、Kotlin语言的先决条件函数

展示了字符串为空时的合理判断

//TODO Kotlin 先决条件函数

fun main() {
    var value1: String? = null
    var value2: Boolean = false

    //检测String的空和Boolean的空 可用先决条件函数
//    checkNotNull(value1)

    requireNotNull(value1)

    require(value2)
}

5、Kotlin subString截取字符串

建议与until配合使用,截取从0到indexof

//TODO Kotlin substring

const val INFO = "zhangsan is success"

fun main() {
    val indexof = INFO.indexOf('i')
    println(INFO.substring(0, indexof))
    //建议使用下面这种方式
    println(INFO.substring(0 until indexof))
}

6、Kotlin 字符串遍历 forEach

//TODO Kotlin 字符串遍历操作

//ABCDEFGHIJKLMNOPQRSTUVWXYZ
fun main() {
    val str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    str.forEach {
        // it等于 str的每一个字符 ABCD。。。

        print("所有的字符是: $it ")
    }

}

7、Kotlin 中数字类型安全转换

//TODO Kotlin 数字类型安全转换函数

fun main() {


    val number: Int = "666".toInt()

    println(number)

    //字符串里面放double无法转化为int,会崩溃
//    val number2:Int = "666.6".toInt()
//    println(number2)

    //解决上面崩溃问题 成功返回,不成功,返回null
    val number2: Int? = "666.6".toIntOrNull()
    println(number2)

    val number3: Int? = "888".toIntOrNull()
    println(number3)


    val number4: Int? = "888.8".toIntOrNull()
    println(number4 ?: "原来你是null")

    //字符串有Int相关转换,尽量用toIntOrNull

}

8、Kotlin apply 内置函数

import java.io.File

//TODO Kotlin 数字类型安全转换函数

fun main() {

    val info = "zhangsan ni hao"
    //普通方式

    println("info字符串长度是: ${info.length}")

    println("info最后一个字符是:${info[info.length-1]}")
    println("info 全部转成小写:${info.toLowerCase()}")


    //apply 内置函数
    //特点:apply始终返回info本身
    val infoNew:String = info.apply {
        // 一般大部分情况下,匿名函数都会持有一个it,但是apply函数不会持有it,持有当前this,this == info
        println(this)

        //this可以省略
        println("apply长度:${length}")
        println("apply最后一个字符是:${this[length-1]}")
        println("apply全部转化为小写:${toLowerCase()}")
    }
    println("apply的返回值:$infoNew")

    println()

    //使用apply函数写法规则
    info.apply {
        //apply返回info本身,可以链式调用
        println("info的长度:$length")
    }.apply {
        println("apply最后一个字符是:${this[length-1]}")
    }.apply {
        println("apply全部转化为小写:${toLowerCase()}")
    }

    //普通写法
    val file = File("D:\a.txt")
    file.setExecutable(true)
    file.setReadable(true)
    println(file.readLines())

    //apply里持有的this就是file本身
    file.apply {
        setExecutable(true)
    }.apply {
        setReadable(true)
    }.apply {
        println(file.readLines())
    }

}

apply总结:

1、apply函数返回类型,都是用于info本身

2、apply函数 ,匿名函数持有的是this == info本身

3、apply函数匿名函数的参数是this

9、Kotlin let内置函数

展示了匿名函数.run和具名函数.run的调用

//TODO Kotlin let内置函数

fun main() {
    //普通方式,对集合第一个元素相加
    val list: List<Int> = listOf(6, 5, 2, 3, 5, 7)
    val value1 = list.first() //第一个元素
    val result1 = value1 + value1

    println(result1)

    //let方式,对集合第一个元素相加,let返回的是匿名函数最后一行,apply返回info本身
    //let 函数里面持有的是it, it代表的是参数 此处it == list本身
    val result2 = listOf(6, 5, 2, 3, 5, 7).let {
        //it == list
        it.first() + it.first()
    }
    println(result2)


    //普通方式对空值判断,对值判null,并返回
    println(getMethod1(null))

    //let+空合并操作符
    println(getMethod3(null))
}

fun getMethod1(value: String?): String {
    return if (value == null) "你传递的内容是null,你在搞什么飞机" else "欢迎回来${value} 非常欢迎"

}

//普通方式简化版本
fun getMehod2(value: String?) = if (value == null) "你传递的内容是null,你在搞什么飞机" else "欢迎回来${value} 非常欢迎"

//let方式 对值判断null,并返回
fun getMethod3(value: String?): String {
    return value?.let {
        "欢迎回来:${it} 非常欢迎"
    } ?: "你传递的内容是null,你在搞什么飞机"
}

//let方式简化版本
fun getMethod4(value: String?) = value?.let {
    "欢迎回来:${it} 非常欢迎"
} ?: "你传递的内容是null,你在搞什么飞机"

let总结

1、let函数的匿名函数参数为it

2、let函数返回类型 是匿名函数的最后一行

3、let函数里it相当于集合,参数本身

10、Kotlin run内置函数

//TODO Kotlin run内置函数

fun main() {
    val str = "zhangsan is Ok"
    //1、run函数返回类型是根据最后一行的变化变化
    //2、run 函数的匿名函数 this == str本身,谁点出run,持有谁,与apply 一样
    val r1: Float = str.run {
        //this == str本身
        true
        45122.3f

    }

    println(r1)

    //下面实现具名函数配合run函数

    //这个是匿名函数配合run
    str.run {

    }

    //这个属于具名函数配合run
    str.run { }

    //这个是属于具名函数 ,具名函数.run()执行
    val r2 = str.run(::isLong)
        .run(::showText)
//       .run {
//           //this == String,this == 前面run的返回值
//       }
        .run(::mapText)
        .run(::println)//系统的具名函数打印
    println(r2)

    //匿名函数调用.run
    str.run {
        if (length > 5) true else false
    }.run {
        if (this) "你的字符串合格" else "你的字符串不合格"
    }.run {
        "[$this]"
    }.run {
        println(this)
    }


}

fun isLong(str: String) = if (str.length > 5) true else false

fun showText(isLong: Boolean) = if (isLong) "你的字符串合格" else "你的字符串不合格"

fun mapText(getShow: String) = "[$getShow]"

run 总结

1、匿名函数参数是this 2、this == str本身,与apply一致,谁调用.run,this就是谁 3、run函数返回类型是根据最后一行的变化变化

11、Kotlin with函数

with和run基本一样,使用不同 with(str),其他功能一样

//TODO Kotlin with内置函数

fun main() {
    val str = "zhangsan is Ok"

    //具名函数
    with(str, ::println)
    var len = with(str, ::getStrLen)
    var r2 = with(len, ::getLenInfo)
    var r3 = with(r2, ::getInfoMap)
    with(r3, ::show)

    println(len)

    //匿名操作
    with(with(with(with(str) {
        len
    }) {
        "你的字符串长度是:$this"
    }) {
        "$this"
    }) {
        println(this)
    }

}

fun getStrLen(str: String) = str.length

fun getLenInfo(len: Int) = "你的字符串长度是:$len"

fun getInfoMap(info: String) = "[$info]"

fun show(content: String) = println(content)

with 总结

1、匿名函数参数是this 2、this == str本身,与apply一致,谁调用.run,this就是谁 3、run函数返回类型是根据最后一行的变化变化

12、Kotlin 中also函数

import java.io.File

//TODO Kotlin also函数

fun main() {

    //also
    //1、与apply 一样,谁.also,返回谁
    //2、与let一样 匿名函数it持有的是str本身
    val str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    val r: String = str.also {
        true
        45453.4f
        424
        'C'

    }
    val r2: Int = 123.also {
        true
        4535.4f
        4125
        'D'
    }
    println(r)

    println(r2)

    str.also {
        println("str原始数据:$str")
    }.also {
        println("str转化为大写效果:${it.toLowerCase()}")
    }.also {
        println("结束了")
    }

    val file = File("D:\a.txt")
    //匿名函数里做的事情和sourceFile无关,返回的是file本身
    val sourceFile = file.also {
        file.setReadable(true)
        file.setWritable(true)
        //...
    }.also {

        //...
    }.also {

        //...
    }

    //sourceFile没有任何影响


}

also函数总结

1、匿名函数的参数是it 2、与apply 一样,谁.also,返回谁 3、与let一样 匿名函数it持有的是str本身

13、Kotlin takeif 内置函数

一般大部分情况下,都是takeif + 空合并操作符

name.takeIf { permissionSystem(name, pwd) } ?: "你的权限不够"


//TODO Kotlin takeif函数

fun main() {

    val result = checkPermission("test", "123")
    println(result)

    println(checkPermission2("Root", "!@#$"))

    //一般大部分清空下,都是takeif + 空合并操作符
}

//前端

public fun checkPermission(name: String, pwd: String): String? {
    //name.takeif{true ,false} true返回name本身,false 返回null

    return name.takeIf { permissionSystem(name, pwd) }
}

public fun checkPermission2(name: String, pwd: String): String? {
    //name.takeif{true ,false} true返回name本身,false 返回null
    return name.takeIf { permissionSystem(name, pwd) } ?: "你的权限不够"
}

//权限系统
private fun permissionSystem(username: String, userpwd: String): Boolean {
    return if (username == "Root" && userpwd == "!@#$") true else false

}

14、Kotlin takeunless 函数

一般清空下takeunless+it.isNullOrBlank()一起使用,判断是否有初始化

class Manager {
    private var infoValue: String? = null
    fun getInfoValue(): String? = infoValue
    fun setInfoValue(infoValue: String?) {
        this.infoValue = infoValue
    }
}


fun main() {
    val manager = Manager()
    //一般清空下takeunless+it.isNullOrBlank()一起使用,判断是否有初始化
    val r = manager.getInfoValue().takeUnless { it.isNullOrBlank() } ?: "未经过任何初始化"
    println(r)
}

takeif 与takeenless比较

1、takeif和takeUnless相反

2、name.takeif{true/false} true:返回name本身,false返回null

3、name.takeunless{true/false} true:返回null,false返回name

4、为什么有takeunless出现?

用于判断是否初始化场景,与空合并操作符一起使用