1. 程式人生 > >Kotlin實戰(三)

Kotlin實戰(三)

Kotlin實戰(三)

一、元組

1.1、二元元組

data class Pair<out A, out B>(
    public val first: A,
    public val second: B
) : Serializable

使用如下:

//宣告1
val a=Pair<Int,String>(125,"Hello")
println(a.first)//125   獲取第一個值
println(a.second)//Hello    獲取第二個值
val message = a.toList()//轉換為集合
println(message)
//[125, Hello] //宣告2:使用 to 宣告 val b=125 to "Hello" println(b.first)//125 獲取第一個值 println(b.second)//Hello 獲取第二個值 // 宣告3:指定接受值 val (x,y)=Pair<Int,String>(125,"Hello") println(x)//125 獲取第一個值 println(y)//Hello 獲取第二個值

1.2、三元元組

data class Triple<out A, out B, out C>(
    public val first: A,
public val second: B, public val third: C ) : Serializable

使用如下:

    //宣告1
    val a = Triple<Int, Boolean, String>(125, true, "Hello")
    println(a.first)//125 第一個值
    println(a.second)//true 第二個值
    println(a.third)//Hello 第三個值
    println(a.toList())//[125, true, Hello] 轉換為集合

    //宣告2
val (i, b, s) = Triple<Int, Boolean, String>(125, true, "Hello") println("i=$i,b=$b,s=$s")//i=125,b=true,s=Hello

二、空安全

2.1、空值問題

val str: String? = null
//1、非空斷言 !!  ,不管是否為空,直接呼叫 不建議使用
// val length = str!!.length//“!!”強行放棄了非空判斷
// println(length)//kotlin.KotlinNullPointerException

//2、空安全呼叫符 ?. ,如果為空,則直接返回null   如果不為空,則返回長度
val length= str?.length
println(length)//null

//3、Elvis運算子 ?: , 下面案例:如果為空返回-1 否則返回值
val str2:Int = str?.toInt()?:-1
//相當於
//    if(str!=null){
//        return str.toInt()
//    }else{
//        return -1
//    }
println(str2)//-1

2.2、空安全轉換(as?)

val a: Any = "Hello"
// as 型別轉換。 轉換失敗丟擲異常
//val aInt: Int = a as Int//java.lang.ClassCastException

//as? 如果轉換失敗則返回null 不會拋錯
val bInt: Int? = a as? Int 
println(bInt)//null

三、接收鍵盤輸入

kotlin接收鍵盤輸入使用readLine()

    var m:Int
    var n:Int
    println("請輸入m的值")
    m= readLine()?.toInt()?:-1
    println("請輸入n的值")
    n= readLine()?.toInt()?:-1
    println("m+n=${m+n}")
//    請輸入m的值
//    1
//    請輸入n的值
//    2
//    m+n=3

四、條件控制語句if

  • if可以作為語句也可以作為表示式。當 if不作為語句,而是表示式,將返回值賦值給變數,則必須要else分支。
  • if表示式可以實現三元運算子效果,具備返回值,然後賦值給變數。
  • if表示式作為塊,可以包含其他表示式,但最後一個表示式是該塊的值。
fun main(args: Array<String>) {
    //求兩個數的最大值
    val a: Int = 2
    val b: Int = 5
    println(max(a, b))//5
}
//求最大值  kotlin沒有三元運算子
//fun max(a:Int,b:Int):Int{
//    if(a>b){
//        return a
//    }else{
//        return b
//    }
//}

//如果只有一行 可以去掉{}
//fun max(a:Int,b:Int):Int{
//    if(a>b)
//        return a
//    else
//        return b
//
//}

//去除if 中的return
//fun max(a: Int, b: Int): Int {
//    return if (a > b) a else b
//}

//函式還可以精簡為函式表示式
fun max(a: Int, b: Int) = if (a > b) a else b

五、repeat簡單迴圈執行(高階函式)

repeat迴圈執行一些重複的任務.

inline fun repeat(times: Int, action: (Int) -> Unit)
//簡單的迴圈執行列印
repeat(3){
    println(it)//0 1 2 
}

六、for迴圈和foreach迴圈

	val str = "abc"
    /*--------------------------for迴圈------------------------------*/
    //不列印角標
    for (c in str) {
        println(c)//a
    }
    // 列印角標
    for ((index, c) in str.withIndex()) {
        println("$index-----$c") //  0-----a
    }

    /*--------------------------forEach迴圈------------------------------*/
    //不列印角標
    str.forEach {
        println(it)//a
    }
    //列印角標
    str.forEachIndexed { index, c ->
        println("$index-----$c")//0-----a
    }

七、返回處理

7.1、continue、break、return

	val str = "abc"
    //列印結果 a c
    for (c in str) {
        if (c == 'b') {
            continue
        }
        println(c)
    }
    //列印結果 a
    for (c in str) {
        if (c == 'b') {
            break
        }
        println(c)
    }
    //forEach中不能使用 continue break 可以使用return ,列印結果 a
    str.forEach {
        if (it == 'b') {
            return
        }
        println(it)
    }

7.2、標籤處返回

    val str1 = "abc"
    val str2 = "123"
    //列印結果  c=a,c1=1  c=a,c1=2  c=a,c1=3
    [email protected] for (c in str1) {
        for (c1 in str2) {
            if (c == 'b') {
                break@tag
            }
            println("c=$c,c1=$c1")
        }
    }

    //列印結果 c=a,c1=1
    [email protected] for (c in str1) {
        [email protected] for (c1 in str2) {
            if (c == 'b') {
                continue@tag2
            }
            if (c1 == '2') {
                return@tag3
            }
            println("c=$c,c1=$c1")
        }
    }

//forEach標籤處返回
 val c = 0..9
    c.forEach {
        if (it == 5) {
            return@forEach
        }
        println(it)//0 1 2 3 4 6 7 8 9

    }

八、while和do while迴圈

  /*--------------------------while--------------------------*/
    //列印結果 1 2 3 4 5 while 是先判斷再執行
    var a = 1
    while (a <= 5) {
        println(a)
        a++
    }

    /*-------------------------- do while--------------------------*/
    //列印結果 6   do……while 是先執行再做判斷
    var b=6
    do {
        println(b)
        b++
    }while (b<=5)

九、when表示式

when 可以用任意表達式(而不只是常量)作為分支條件,可以用任意表達式(而不只是常量)作為分支條件;可以檢測一個值是(is)或者不是(!is)一個特定型別的值(由於智慧轉換,你可以訪問該型別的方法和屬性而無需任何額外的檢測);可以用來取代if-else-if鏈。如果不提供引數,所有的分支條件都是簡單的布林表示式,而當一個分支的條件為真時則執行該分支:

9.1、簡單使用

val age = 18
println(todo(age))//開始上大學

fun todo(age: Int): String {
    when (age) {
        7 -> {
            return "開始上小學"
        }
        12 -> {
            return "開始上中學"
        }
        15 -> {
            return "開始上高中"
        }
        18 -> {
            return "開始上大學"
        }
        else -> {
            return "未知"
        }
    }
}

9.2、when表示式加強

val age = 13
println(todo2(age))//上中學

fun todo2(age: Int): String {
    when (age) {
//        is Int -> {//是Int型別
//
//        }
        in 0..6 -> {//在區間裡面
            return "在家玩"
        }
        7 -> {
            return "開始上小學"
        }
        in 7..11 -> {//在區間裡面
            return "上小學"
        }
        12 -> {
            return "開始上中學"
        }
        13, 14 -> {//多條件合併
            return "上中學"
        }
        15 -> {
            return "開始上高中"
        }
        16, 17 -> {//多條件合併
            return "上高中"
        }
        18 -> {
            return "開始上大學"
        }
        else -> {
            return "未知"
        }
    }
}

9.3、when表示式不帶引數

val age = 15
/**
 *  kotlin裡面的when表示式原理:
 *  簡單的when表示式通過switch語句實現
 *  複雜的when表示式通過if else來實現
 */
println(todo3(age))//開始上高中

fun todo3(age: Int): String {
    when {
        age in 0..6 -> {//在區間裡面
            return "在家玩"
        }
        age == 7 -> {
            return "開始上小學"
        }
        age in 7..11 -> {//在區間裡面
            return "上小學"
        }
        age == 12 -> {
            return "開始上中學"
        }
        age == 13 || age == 14 -> {//多條件合併
            return "上中學"
        }
        age == 15 -> {
            return "開始上高中"
        }
        age == 16 || age == 17 -> {//多條件合併
            return "上高中"
        }
        age == 18 -> {
            return "開始上大學"
        }
        else -> {
            return "未知"
        }
    }
}

9.4、when表示式返回值

val age = 11
/**
 * when表示式返回值在{}最後一行  lambda表示式最後一行為返回值
 */
println(todo4(age))//上小學

fun todo4(age: Int): String {
    return when (age) {
        in 0..6 -> {
            "在家玩"//在區間裡面
        }
        7 -> {
            "開始上小學"
        }
        in 7..11 -> {
            "上小學"
        }
        12 -> {
            "開始上中學"
        }
        13, 14 -> {
            "上中學"
        }
        15 -> {
            "開始上高中"
        }
        16, 17 -> {
            "上高中"
        }
        18 -> {
            "開始上大學"
        }
        else -> {
            "未知"
        }
    }