Kotlin 学习笔记(二) if、when、is 、枚举 和 异常

BluebellBeech_ZH-CN8269343251_1920x1080.jpg

前言
本文章只是用于记录学习,所以部分地方如果有错误或者理解不对的地方,麻烦请指正。本篇为 csdn 原文章 转移修改版 原文章

Kotlin 学习笔记 (一)

1.枚举

enum class color{
    RED,
    GREEN,
    BLUE
}

   在kotlin 中声明枚举类需要添加 enum class 枚举名,enum 算是一个 软关键词,所以不需搭配 class ,和java 中 枚举类是值的列表 不一样,kotiln 是可以给枚举添加 属性和方法的。如下段代码,

enum class color(val r:Int , val g:Int ,val b:Int){
    RED(255,0,0),
    GREEN(0,255,0),
    BLUE(0,0,255);

    fun rgb(){
        println(r+g+b)
    }
}

// main 方法中引用
 color.BLUE.rgb()
 

   上图 枚举类的构造方法和属性的时候和常规类 是一样的,所以声明 枚举类常亮的时候就必须输入属性值,上段代码 也是 介绍到了 kotlin 中少数需要 分开的地方,用于将 常亮列表 和 方法 的分开。

2.when循环

   结合上边我们学到的 枚举 我们结合when 学习一下基础使用

fun getColor(color :Color){
    when(color){
        Color.BLUE -> println("this is blue")
        Color.RED -> println("this is RED")
        Color.GREEN -> println("this is GREEN")
    }
}

// main 调用
getColor(Color.GREEN)

   如上段代码,我们使用when 来判断,但是 我们不用每一句后边都添加 break 来代表结束,kotlin 中如果 某一个分支 匹配成功,就不会进入到其他的分支,当然也可以 多条件,如下

fun getColor(color :Color){
    when(color){
        Color.BLUE ,Color.RED -> println("this is blue or red")
        Color.GREEN -> println("this is GREEN")
    }
}

   如果有 两到多个条件,条件之间可以用 逗号分隔。当然kotlin中也可以使用 任意对象对接使用

fun maxColor(color1 :Color ,color2 :Color){
    when(setOf(color1 ,color2)){
        setOf(Color.BLUE ,Color.RED) -> println("this is blue or red")
        setOf(Color.BLUE ,Color.GREEN) -> println("this is GREEN")
        else -> println("this is not max color")
    }
}

   when 检查 分支是否符合条件,如果都不符合就走 else ,当然这样比较每次都会创建 一些set 对象,我们也可以 when中 不添加参数,直接比较 color1 和 color 2 是否一样,但是代码更多,有一点不太好理解。

3.if

在上一张主要用到了 if 和 if的缩写形式,如果if 返回单句表达式。

fun max(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

// 单句表达式
fun getResult(a: Int, b: Int) = a + b

// 加上 if
fun getMaxResult(a: Int, b: Int) = if(a>b) a else b

4.for in 区间

  1. kotlin 中的for 循环相较于 java 更加的简洁
// in操作符可以判断是否arg是否在args里面
for (arg in args) { 
    print(arg)
} 

// 另外的一种姿势
for (i in args.indices) {
    print(args[i])
}

   上段代码中我们使用了 in ,接下在 我们主要看下 in 的搭配使用和每种使用标识的具体意思

//  检测某个数字是否在指定区间外
if (x in 1..y-1) { // x是否在 1到y-1的范围 
    print("OK")
}
for (i in 1..100) { ... }  //  1到100范围
for (i in 1 until 100) { ... } // 半开范围,不包括100,相当于[1,100)
for (x in 2..10 step 2) { ... } // 每次加2,内容为 x , x+2 ,x+4 ...
for (x in 10 downTo 1) { ... } // 倒序

   如果让我们用 kotlin 写 1 到100 倒序的所有 偶数,我们就可以这样写

for(i in 100 downTo 1 step 2){
    prinln(....)
}

   使用lambda 表达式来过滤(filter)和映射(map)集合

fun main(args: Array<String>) {
    val langs = listOf("C", "C++", "Java", "Python", "JavaScript")

    // startsWith 给定的字串和自己定义的字串相比较,看是否是前缀相同
    langs.filter { it.startsWith("C") }  
            .sortedBy { it }
            .map { it.toUpperCase() }
            .forEach { println(it) }
}

上面代码 引用了超纲的 顺序操作符

reversed() : 反序。即和初始化的顺序反过来。
sorted() : 自然升序。
sortedBy{} : 根据条件升序,即把不满足条件的放在前面,满足条件的放在后面
sortedDescending() : 自然降序。
sortedByDescending{} : 根据条件降序。和sortedBy{}相反

6. while

   kotlin 中的 while 和java 是类似的

while (i < args.size) {
    print(args[i++])
}  

学习完上边的 if、is、 when 我们来尝试 写一个 方法、

fun main(args: Array<String>) {
    println(descript("hello"))
}

fun descript(obj: Any): String = when (obj) {
    1 -> "one"
    "hello" -> "hello word"
    is Long -> "long type"
    !is String -> "is not String"
    else -> {
        "unknown type"
    }
}

7. 异常

   kotlin 中的 异常 和 java 中的异常是差不多的,不过java 中需要new ,而kotlin中 都不需要new,直接 throw IllegalArgumentException("err") , kotlin 中的 throw 算是一种表达式,可以在另外的表达式中使用。

fun maxColor(color1 :Color ,color2 :Color){
    when(setOf(color1 ,color2)){
        setOf(Color.BLUE ,Color.RED) -> println("this is blue or red")
        setOf(Color.BLUE ,Color.GREEN) -> println("this is GREEN")
        else ->  throw IllegalArgumentException("err")
    }
}

   java 和 kotlin 中的 try catch finally 适用方式是一样的,不过在kotlin中,try catch 为一种表达式。

fun maxColor(color1 :Color ,color2 :Color) {
    var str = try {
        when(setOf(color1 ,color2)){
            setOf(Color.BLUE ,Color.RED) -> "this is blue or red"
            setOf(Color.BLUE ,Color.GREEN) -> "this is GREEN"
            else ->  throw IllegalArgumentException("err")
        }
    } catch (e:IndexOutOfBoundsException){
        null
    }
    print(str)
}

   从上边代码可以看到,try 作为 表达式 可以将值赋值给一个变量的,如果when 比较分支 成功 就会打印对应的 字符串,如果都没有就抛出异常,catch 捕捉异常,返回 null。

Kotlin 学习笔记 (三)

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