注:编码工具为IntelliJ

目录

空安全机制

安全调用操作符:?

非空断言操作符:!!

字符串为空示例:

字符串不为空示例:

if判空:和Java一样

空合并操作符:?:

异常

普通异常

自定义异常

先决条件函数

checkNotNull

requireNotNull

require

字符串

substring

split

replace

==和===

遍历

与数字互相转换

内置函数

apply

let

run

with

also

takeIf

takeUnless

内置函数小结


空安全机制

        Kotlin定义任意数据类型变量,默认是不可空类型,不能赋值null给该变量。

        Kotlin定义任意数据类型可空变量,需要在数据类型后面加问号(?),如:var str: String? = null。

示例:

fun main() {
    var str = "string"
    // str = null // 编译器报错:Null can not be a value of a non-null type String
    var nullTypeStr: String? = null
    nullTypeStr = str
    println(nullTypeStr)
}

输出:

string

安全调用操作符:?

        访问可空数据类型变量的方法或属性,可以用安全类型操作符?,如果该变量为空,则不会继续访问方法或属性,直接返回null,反之,则会继续访问方法或属性。

package step_three

fun main() {
    var str: String? = null
    println(str?.length)
    str = "Hi"
    println(str?.length)
}

输出:

null
2

非空断言操作符:!!

        访问可空数据类型变量的方法或属性,可以用非空断言操作符!!,如果该变量为空,则直接抛出空指针异常,反之,则会访问方法或属性。

字符串为空示例:

fun main() {
    var str: String? = null
    println(str!!.length)
}

输出:

Exception in thread "main" java.lang.NullPointerException
	at step_three.ExclamationMarkKt.main(ExclamationMark.kt:5)
	at step_three.ExclamationMarkKt.main(ExclamationMark.kt)

字符串不为空示例:

fun main() {
    var str: String? = "DearMe"
    println(str!!.length)
}

输出:

6

if判空:和Java一样

fun main() {
    var str: String? = null
    if(str != null)
    {
        println(str)
    }else{
        println("null")
    }
}

输出:

null

空合并操作符:?:

        当空合并操作符前面的语句执行结果为空时,返回操作符后面的语句执行结果。

fun calc(i: Int): String? = if(i > 8) "yes" else null
fun main() {
    println(calc(8) ?: "Weekend")
}

输出:

Weekend

异常

普通异常

fun main() {
    try{
        TODO("ANiang")
    }catch (e: Exception){
        e.printStackTrace()
    }
}

输出:

Exception in thread "main" kotlin.NotImplementedError: An operation is not implemented: ANiang
	at step_three.ExceptionTestKt.main(ExceptionTest.kt:8)
	at step_three.ExceptionTestKt.main(ExceptionTest.kt)

自定义异常

import java.lang.IllegalArgumentException

class CustomException: IllegalArgumentException("参数非法")

fun checkException(num: Int): Int{
    if(num !in 1..100){
        throw CustomException()
    }
    return num + 10000
}

fun main() {
    try{
        checkException(101)
    }catch (e: CustomException){
        println("custom msg is $e")
    }
}

输出:

custom msg is step_three.CustomException: 参数非法

先决条件函数

        先决条件函数用于判断条件是否满足或者变量是否为null的。

checkNotNull

fun main() {
    var str: String? = null
    checkNotNull(str)
}

输出:

Exception in thread "main" java.lang.IllegalStateException: Required value was null.
	at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt:5)
	at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt)

requireNotNull

fun main() {
    var str: String? = null
    requireNotNull(str)
}

输出:

Exception in thread "main" java.lang.IllegalArgumentException: Required value was null.
	at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt:5)
	at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt)

require

fun main() {
    var str: String? = null
    require(str != null)
}

输出:

Exception in thread "main" java.lang.IllegalArgumentException: Failed requirement.
	at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt:5)
	at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt)

字符串

substring

fun main() {
    val msg = "java.lang.IllegalArgumentException"
    println(msg.substring(0, 4))
    println(msg.substring(5 until 9))
    println(msg.substring(10))
    println(msg.substring(0..10))
}

输出:

java
lang
IllegalArgumentException
java.lang.I

split

fun main() {
    var str = "What Do I Call You"
    val list = str.split(" ")
    list.forEach(::println)
    val(e1, e2, e3, e4) = list
    println("---------------------")
    println("e1:$e1, e2:$e2, e3:$e3, e4:$e4")
    println(list)
}

输出:

What
Do
I
Call
You
---------------------
e1:What, e2:Do, e3:I, e4:Call
[What, Do, I, Call, You]

replace

const val ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
fun main() {
    val encodeResult = ALPHABET.replace(Regex("[AHORUX]")){
        when(it.value){
            "A" -> "5"
            "H" -> "4"
            "O" -> "3"
            "R" -> "7"
            "U" -> "0"
            "X" -> "1"
            else -> it.value
        }
    }
    println(encodeResult)
    val decodeResult = encodeResult.replace(Regex("[013457]")){
        when(it.value){
            "5" -> "A"
            "4" -> "H"
            "3" -> "O"
            "7" -> "R"
            "0" -> "U"
            "1" -> "X"
            else -> it.value
        }
    }
    println(decodeResult)
}

输出:

5BCDEFG4IJKLMN3PQ7ST0VW1YZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ

==和===

        ==相当于Java的equals方法。

        ===相当于Java的==。

fun main() {
    val str = "Hope"
    val str2 = "Hope"
    val str3 = "hope".capitalize()
    println(str == str2)
    println(str == str3)
    println(str === str2)
    println(str === str3)
}

输出:

true
true
true
false

遍历

fun main() {
    ALPHABET.forEach{
        print("$it ")
    }
    println()
    println(ALPHABET.first())
    println(ALPHABET[25])
}

输出:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
A
Z

与数字互相转换

fun main() {
    val i = 99
    val istr = "10000"
    val dstr = "99.99"
    val d = 887.878
    println(i.toString())
    println(istr.toIntOrNull())
    println(istr.toDouble())
    println(dstr.toIntOrNull()) // 浮点型字符串不能转换为整型
    println(dstr.toFloat())
    println(dstr.toDouble())
    println(d.toInt())
    println("%.2f".format(d)) // 将浮点型数据格式化为保留两位小数的字符串
}

输出:

99
10000
10000.0
null
99.99
99.99
887
887.88

内置函数

apply

        apply函数返回的是调用者本身。

        apply后面跟匿名函数,则会将调用者本身传进匿名函数,并用this指代。

        apply函数可以将函数引用作为参数。

fun main() {
    println("code".apply {
        println(this.length)
        println(count { it == 'a' })
        println(first())
        println(this[length - 1])
    })

    println("code".apply(::println))
}

输出:

4
0
c
e
code
code
code

let

        let函数返回的是匿名函数或者函数引用的返回值。

        let后面跟匿名函数,则会将调用者本身传进匿名函数,并用it指代。

        let函数可以将函数引用作为参数。

fun main() {
    println("vision".let {
        println(it.first())
        println(it.lastIndex)
        true
    })
    println("flyme".let(::println))
}

输出:

v
5
true
flyme
kotlin.Unit

run

        run函数返回的是匿名函数或者函数引用的返回值。

        run后面跟匿名函数,则会将调用者本身传进匿名函数,并用this指代。

        run函数可以将函数引用作为参数。

fun main() {
    println("2021-10-31 16:05:13".run {
        println(length)
        println(count(){it == '3'})
        "this is result from anonymous function"
    })
    println("2021-10-31 16:06:08".run(::println))
}

输出:

19
2
this is result from anonymous function
2021-10-31 16:06:08
kotlin.Unit

with

        除了调用方式不一样,其他和run函数一样。with通过将调用者作为参数进行运作。

fun main() {
    println(with("Struggle") {
        println(toUpperCase())
        "OK"
    })
    println(with("Fashion", ::println))
}

输出:

STRUGGLE
OK
Fashion
kotlin.Unit

also

        also函数返回的是调用者本身。

        also后面跟匿名函数,则会将调用者本身传进匿名函数,并用it指代。

        also函数可以将函数引用作为参数。

fun main() {
    println("salang".also {
        println(it.capitalize())
        println(it.length)
        println(it.toUpperCase())
    })

    println("Enough".also(::println))
}

输出:

Salang
6
SALANG
salang
Enough
Enough

takeIf

        takeIf函数返回值取决于匿名函数或者函数引用的返回值,如果返回值为true,则返回调用者本身,否则,返回null。

        takeIf后面跟匿名函数,则会将调用者本身传进匿名函数,并用it指代。

        takeIf函数可以将函数引用作为参数。

fun main() {
    val name = "admin"
    val pwd = "123"
    println(name.takeIf {
        it == "admin" && pwd == "123456"
    } ?: "error")
}

输出:

error

takeUnless

        takeUnless函数返回值取决于匿名函数或者函数引用的返回值,如果返回值为false,则返回调用者本身,否则,返回null。

        takeUnless后面跟匿名函数,则会将调用者本身传进匿名函数,并用it指代。

        takeUnless函数可以将函数引用作为参数。

fun main() {
    var str : String? = null
    println(str.takeUnless { str.isNullOrBlank() } ?: "demo")
}

输出:

demo

内置函数小结

内置函数

函数名

指代

返回值

apply

this

调用者本身

let

it

匿名函数或函数引用返回值

run

this

匿名函数或函数引用返回值

with

this

匿名函数或函数引用返回值

also

it

调用者本身

takeIf

it

匿名函数或函数引用返回true,返回调用者本身,否则,返回null

takeUnless

it

匿名函数或函数引用返回false,返回调用者本身,否则,返回null