Kotlin实战(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zping0808/article/details/85080110

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
    tag@ for (c in str1) {
        for (c1 in str2) {
            if (c == 'b') {
                break@tag
            }
            println("c=$c,c1=$c1")
        }
    }

    //打印结果 c=a,c1=1
    tag2@ for (c in str1) {
        tag3@ 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 -> {
            "未知"
        }
    }

猜你喜欢

转载自blog.csdn.net/zping0808/article/details/85080110