Android 知识Kotlin 知识

Kotlin 小细节记录(3)

2022-01-03  本文已影响0人  zcwfeng

45.Kotlin语言的replace
46.Kotlin语言的==与===比较操作
47.Kotlin语言的字符串遍历操作
48.Kotlin语言中数字类型的安全转换函数
49.Kotlin语言中Double转Int与类型格式化
50.Kotlin语言的apply内置函数
51.Kotlin语言的let内置函数
52.Kotlin语言的run内置函数
53.Kotlin语言的with内置函数
54.Kotlin语言的also内置函数
55.Kotlin语言的takeIf内置函数
56.Kotlin语言的takeUnless内置函数

replace

内部函数
public inline fun CharSequence.replace(regex: Regex, replacement: String): String = regex.replace(this, replacement)

参数是正则表达式,返回表达式字符串

fun main(){
    val pwd = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    val result = pwd.replace(Regex("[AKMN]")){
        when(it.value){
            "A" -> "1"
            "K" -> "3"
            "M" -> "9"
            "N" -> "5"
            else -> it.value
        }

    }
    println(result)
}

foreach lambda

    pwd.forEach {
        print("$it >")
    }


安全类型转换toIntOrNull,以此类推

val num1 = "666".toIntOrNull()
    println(num1)
    val num2 = "666.66".toIntOrNull()
    println(num2)
    val num3 = "666.66".toIntOrNull()
    println(num3 ?: 0)

数字格式化

    val a = 63.45678
    val b = 64.87654
    val c = "64.87654"
    println(a.toInt())
    println(b.toInt())
    println(a.roundToInt())
    println(b.roundToInt())

    println(("%.3f").format(a))

apply

 val info = "Hello World!"

    println(info.length)
    println(info[info.length - 1])
    println(info.toLowerCase())

    //apply 始终返回本身
    val re = info.apply {
        println(this)
    }.apply {
        println("$length")
    }.apply {
        println("$this{[length - 1]}")
    }.apply {
        println(toLowerCase())
    }
  比如应用到File操作等

 apply 返回的始终是自己的引用this,可以链式调用,一般结合binding等共有属性判断是否为空等操作使用

let 最后一行就是他的返回值

val list = listOf(6, 5, 4, 3, 2, 1).let {
        it.first()
        true
    }
    println(list)

    println(method1(null))
    println(method2(null))

fun method1(param: String?) = if(param.isNullOrBlank()) "your param are empty" else "your param is ${param}"

fun method2(param: String?) = param?.let { "your param is $param?" } ?: "your param are empty"

使用场景是,判断是否为空等的造作,如果为null如何处理

let 我在实战中的一个用法,结合Spannable,查找回复@xxxx,高亮显示文本


 holder.dataBinding?.apply {
                tvCommentNikename.text = item.userInfo?.nick?.let {
                    "${it}: "
                } ?: ""


                val filter = Regex("[@][\\S]+\\s").find(item.content, 0)?.range
                val begin = filter?.first ?: 0
                val end = filter?.last ?: 0
                tvCommentContent.text = filter.let {
                    it?.let {
                        if(begin == end) {
                            item.content
                        } else {
                            val sb = SpannableString(item.content)
                            sb.setSpan(
                                ForegroundColorSpan(Color.parseColor("#44adfe")),
                                begin,
                                end,
                                Spannable.SPAN_INCLUSIVE_EXCLUSIVE
                            )
                            sb
                        }
                        

                    } ?: item.content
                } ?: item.content
            }

run , 持有的是自身引用this和apply,返回值如let最后一行的值决定run的返回值

str.run{
匿名函数
}

str.run(::具名函数)
 val str = "123456"
    val strResult = str
        //boolean
        .run(::isLong)
        //String
        .run(::showText)
        .run (::mapText)
//        .run(::println)

    println(strResult)//<字符串合格>
行·



fun isLong(str: String) = str.length > 5
fun showText(isLong: Boolean) = if (isLong) "字符串合格" else "不合格"
fun mapText(param: String) = "<${param}>"

with 和run基本一样,但是可以传入参数

 str = "David"

    with(str, ::println)

    with(with(with(with(str) {
        length
    }) {
        "your name length is:$this"
    }) {
        "[$this]"
    }) {
        println(this)
    }

    val r1 = with(str,::getStrLength)
    var r2 = with(r1,::getLenInfo)
    var r3 =with(r2,::getInfoMap)
    with(r3,::showStr)

also 类似apply,返回对象是 xxx.also. 前面xxx本身


"demo".also {
        println(it)
    }.also {
        println(it.toUpperCase())
    }

    val file = File("./test.txt")
    var sourceFile = file.also {
        it.setReadable(true)
        it.setWritable(true)
        println(file.readLines())
        // ... 其他很多事
    }.also {
        // ...
    }
    //sourceFile 没有任何影响

takeIf 需要和空操作一起使用

 val result1 = checkPermission("Root","123456")
    if(result1 != null) {
        println("欢迎@${result1}用户登陆拥有超级权限")
    } else {
        println("权限不够")
    }


fun checkPermission(name:String,pwd:String):String?{
    return name.takeIf { permissionSystem(name,pwd) }
}

fun permissionSystem(username:String,pwd:String):Boolean{
    return username == "Root" && pwd == "123456"
}

takeUnless

 val infoStr:String? = "1234"/*null*/
    val result3 = infoStr.takeUnless { infoStr.isNullOrBlank() }?:"没有初始化"
    println(result3)
上一篇下一篇

猜你喜欢

热点阅读