Kt学习03

package com.learn

/**
 * 学习第三天
 */
class Kt3 constructor() {

    //Kotlin 条件控制
    //IF表达式
    //和java差不太多
    fun ifTest(b: Int) {
        var max = 1
        if (max < b) max = b
        else max = 1

        println(max)
        //也可以作为表达式 可以赋值给变量 所以不用像java一样 写三元操作符
        var a = if (b < 3) 3 else b
        println(a)
    }


    //使用区间
    fun sectionTest(a: Int) {
        if (a in 1..5) println("$a is in [1,5]")
    }

    //When表达式
    //when 将它的参数和所有的分支条件顺序比较,直到某个分支满足条件。
    //when 既可以被当做表达式使用也可以被当做语句使用。如果它被当做表达式,符合条件的分支的值就是整个表达式的值,如果当做语句使用, 则忽略个别分支的值。
    //when 类似其他语言的 switch 操作符。
    fun testWhen(a: Int) {
        //最简单的形式
        when (a) {
            1 -> println("a is 1")
            2 -> println("a is 2")
            else -> println("a is not 1 or 2")//else 相当于java switch语句中的default分支
        }

        //如果分支处理方式相同,分支可以合并,用都好分隔
        when (a) {
            1, 2 -> println("a is $a")
            else -> println("a is not 1 or 2")
        }

        //我们也可以检测一个值在(in)或者不在(!in)一个区间或者集合中
        var aList = Array(6) { i -> i }
        for (i in aList) println(i)
        when (a) {
            in 1..5 -> println("a is in [1,5]")
            !in 1..5 -> println("a is not in [1,5]")
            in aList -> println("a is in aList")
            else -> println("a is $a")
        }
        // 第一个分支范围是[1,5],第三个分支范围是[0,5] 但是只走了第一个分支,所以这个是互斥的。

        //另一种可能性是检测一个值是(is)或者不是(!is)一个特定类型的值。注意: 由于智能转换,你可以访问该类型的方法和属性而无需 任何额外的检测。
        var x: Any = "1234"
        var booleanX: Boolean = when (x) {
            is String -> x.endsWith("4")
            else -> false
        }

        //when 也可以用来取代 if-else if链。 如果不提供参数,所有的分支条件都是简单的布尔表达式,而当一个分支的条件为真时则执行该分支
        when {
            booleanX -> println("x is endWith 4")
            else -> println("x is not endWith 4")
        }

        when {
            a in aList -> println("$a is in aList")
            a in 1..6 -> println("$a is in [1,6]")
            else -> println("")
        }
        //写法多变,但是所有判断都是互斥的,只要有ture的分支达成,后面的分支是不会去判断的。
    }

    //Kotlin 循环控制
    //FOR循环
    fun testFor() {
        var items = Array<String>(3) { i -> "第${i}个apple" }
        var items2 = listOf<String>("apple", "orange", "banana")
        //第一种
        for (item in items) {
            println(item)
        }
        //第二种能获取到下标
        for (index in items2.indices) {
            println("第${index}个元素是:${items2[index]}")
        }
    }


    //while 与 do...while 循环
    //do…while 循环 对于 while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
    //do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次
    //早期的 Kotlin 版本函数参数是可以定义成 var 的,不过后来官方明确了「函数参数都是不可变」 所以方法入参默认都是val了 我说怎么报红了
    public fun testWhile(a: Int): Unit {
        //第一种while循环
        var b = a
        while (b > 4) {
            println("当前b=${b},值大于4,继续循环-1")
            b--
        }
        println("--------------")
        //第二种do-while  不论是否满足条件,总会走一次逻辑代码
        var c = a
        do {
            when {
                c <= 4 -> println("当前c=${c},值小于等于4,会跳出循环")
                c > 4 -> println("当前c=${c},值大于4,继续循环-1")
                else -> println("这是个啥?")
            }
            c--
        } while (c > 4)
        println("--------------")
    }


    //返回和跳转
    //Kotlin 有三种结构化跳转表达式:
    //    return。默认从最直接包围它的函数或者匿名函数返回。
    //    break。终止最直接包围它的循环。
    //    continue。继续下一次最直接包围它的循环。
    //和java没什么不同

    //Break 和 Continue 标签
    //Kotlin 有函数字面量、局部函数和对象表达式。因此 Kotlin 的函数可以被嵌套。 标签限制的 return 允许我们从外层函数返回。 最重要的一个用途就是从 lambda 表达式中返回
    //这个java也有,但是kotlin不一样,好像能用的范围更广了
    fun testLabel() {
        var ints = listOf<Int>(1, 2, 3, 4, 5, 6, 7)
        var items = listOf<String>("apple", "orange", "banana")
        //普通的return 这个 return 表达式从最直接包围它的函数即 testLabel 中返回。
        items.forEach {
            if (it.equals("orange")) {
//                return println("在 $it 处返回")
            }
            println(it)
        }
        println("-------------")
        //带标签的返回
        items.forEach forEach@{
            if (it.equals("orange")) return@forEach println("在 $it 处返回")//这里返回了循环,等于是没返回
            println(it)
        }

        //试试continue 和 break
        println("-------------")
        ints@ for (i in ints) {
            println("i = $i")
            items@ for (item in items) {
                when {
                    item.equals("orange") && i == 1 -> continue@ints
                    i == 2 -> continue@items//这个 预期i=2时,不会打印所有水果名字,应为continue去了上层循环
                    i == 3 -> break@items // 这个 预期i==3时,不会打印水果名字,因为break掉了这次
                    i == 5 -> break@ints //直接跳出了循环
                    else -> println("i = $i , items = $item")
                }
            }
            println("********")
        }
        //这个标签有点意思啊,这个控制,就是容易自己晕了,所以写的时候必须写好注释,把行为逻辑写清楚
    }


    //类和对象
    //和java差不多,没有new关键字
    var kt3 = Kt3()

    //类的属性
    var age = 12
    var height = 145
    val location = "上海市闵行区啦啦啦小区12243123号"

    //使用
    fun testAttribute() {
        //属性的使用和java差不多
        var newAge = kt3.age + 20

    }

    //Kotlin 中的类可以有一个 主构造器,以及一个或多个次构造器,主构造器是类头部的一部分,位于类名称之后:
    //就是类名后面括号部分就是构造器,Kt3的主构造器就是一个什么都不传,什么都不返回的
    //次级构造器
    constructor(age: Int, height: Int) : this() {
        this.age = age
        this.height = height
    }
    //如果主构造器没有任何注解,也没有任何可见度修饰符,那么constructor关键字可以省略,就是类名上面的可以省略
}


fun main(args: Array<String>) {
//    Kt3().ifTest(6)
//    Kt3().sectionTest(2)
//    Kt3().testWhen(5)
//    Kt3().testFor()
//    Kt3().testWhile(7)
//    println("*****************")
//    Kt3().testWhile(3)
    Kt3().testLabel()

}

总结

今天主要是循环控制和条件控制的学习,类学历个开头,晚上了要去吃完饭了,明天继续学习。
今天主要的知识点:
1.if控制语句,没什么特别的,和java不同的是可以在赋值的时候用作表达式,不需要写三元操作符
2.区间,就是上次的 a..b ,没什么好说的,记得step和until关键字就行了
3.when表达式,这个怎么说呢和java的switch语句挺像。分支互斥;分支可以合并,逗号分隔;搭配in,!in,is,!is等一起食用;else分支相当于default分支
4.For循环,一种for(item in items),和java的forecah一样,一种for(index in items.indices)index为下标,没什么好说的,kotlin也有自己的foreach
5.while循环,和java基本一样,分为while循环和do-while循环,后一种是不论是否满足条件,都会运行一次do里面的逻辑
6.Label标签,这个和return/break/continue搭配使用,有点意思。在方法,循环前面打标签--名字@,然后break@名字,会直接返回/跳出/continue到相应的位置.这种跳转很有意思,但是需要写了以后需要清晰点的注释来解释代码逻辑,要不然可能会看晕


图片.png

今天就到这里,加油,争取一个星期把基础都看完,然后就是写点东西,在复习android相关内容的时候上手用Kotlin来实现出来。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容