Kotlin入门第三节

自定义异常及处理

package com.fyx.s1

import java.lang.Exception

fun main() {
    try {
        var name: String? = null
        checkException(name)
        name!!.length
    } catch (e: Exception) {
        println(e)
    }
}

fun checkException(name: String?) {
    name ?: throw NullExcption()
}
class NullExcption : IllegalAccessException("自定义异常报错")

值比较和引用比较

package com.fyx.s1

import java.lang.Exception

fun main() {
    var name1: String = "Jack"
    var name2: String = "Jack"
    //==比较的是值 所以等于true
    if (name1 == name2) println(true) else println(false)
    //jvm底层维护的常量池所以为true
    if (name1 === name2) println(true) else println(false)
    //先定义了一个jack发现常量池配没有便分配了一个新的引用地址,然后调用函数改变值,但是地址值没有改变引用,所以是false
    var name3 = "jack".capitalize()
    println(name3)
}

字符串遍历

package com.fyx.s1

import java.lang.Exception

fun main() {
    var name: String = "ASDSADSADSJAIDJISAJDI"
    name.forEach {
        //默认有一个参数it
        //println(it)
        //也可重写参数名称
            data ->
        println(data)

    }
}

安全类型转换函数

package com.fyx.s1

import java.lang.Exception

fun main() {
    var ints1: Int = "127".toInt();

    //报错
    //var ints2: Int = "127.1".toInt();

    //安全转换函数 如果转换错误就用Null代替
    var ints3: Int? = "127.1".toIntOrNull();

    println(ints3)

}

apply函数和let函数 和run函数和with函数和also

  • apply 的函数始终返回当前对象,内部的默认值为this
  • let 返回值根据最后一行的类型作为推断,域对象为it
  • run 函数的返回值是根据最后一行代码推断出来的,域对象为this
  • with 函数不能用点去调用,可以直接声明调用,返回值根据最后一行的代码最推断,域对象为this
  • also 函数始终返回当前对下那个,域对象为it

他们统一都支持链式调用,类似下面apply的示例 除了with不可以

package com.fyx.s1


fun main() {
    //apply
    var name12 = "SIAJDIASJDOIASJDOJASD"
    name12.apply {
        println("字符串的长度$length ")
    }.apply {
        println("字符串的最后一位值${this[length - 1]} ")
    }.apply {
        println("字符串大小转换${this.toLowerCase()} ")
    }
    //let
    var name = "123"
    name.let {
        "字符串组合${1 + it.toInt()} "
    }

    //run
    var name1 = "123"
    //匿名调用
    var mes = name1.run {
        "字符串组合${1 + this.toInt()} "
        54
    }
    //具名调用
    .run { ::compertTO }
    
    
    //with
    var name4 = "123"
    var num: Int = with(name4, {
        println(name4)
        this.length
    })
    //具名调用
    with(name4, ::compertTO1)


   //also 
  var name12 = "xixi"
    //匿名调用
    name12.also {
        println(it)
    }
    //具名调用
    name12.also(::print)
}

fun compertTO(num: Int): String {
    println("进入函数")
    if (num < 10) {
        return "你好小"
    } else {
        return "你很大"
    }
}

fun compertTO1(num: String): String {
    println("进入函数")
    return num
}

takeIf 函数和takeUnless函数

  • takeIf 函数需要传入一个返回boolean类型的函数,如果返回为true,那么names是当前对象,如果是false那么names则是null
  • takeUnless和takeIf相同,只不过true返回null,false返回当前本身
package com.fyx.s1


fun main() {
    var name = "Admin"

    var names =name.takeIf(::iftest)
    println(names)
}


fun iftest(name: String): Boolean {
    return if (name == "Admin") true else false
}
posted @ 2022-04-12 16:59  xiye1  阅读(20)  评论(0)    收藏  举报