Kotlin基础

  • 目录与的结构无需匹配:源代码可以在文件系统的任意位置
  • 一切都是对象(即,任何变量都是根据引用类型来使用的)
  • 变量分为var(可变的)和val(不可变的)。首选使用val不变值的好处:可预测的行为和线程安全
  • 具有变量类型推断功能,例如可以这么写:
var x = 5 //自动推断出‘Int’类型
var y: Int = 1 //显式指定‘Int’类型
  • is运算符检测一个表达式是否为某类型的一个实例
  • 原始字符串三重引号分隔。原始字符串可包括换行符和任何其他字符
  • 字符串可以包含模板表达式,模板表达式由$符号开始
  • if语句是一个表达式,即它会返回一个值,例如:
val max = if (a > b) a else b
  • if的分支也可以是代码块,最后的表达式作为该快的值,例如:
val max = if (a > b) {
    print("max is a")
    a
} else {
    print("max is b")
    b
}
  • kotlin没有三元表达式,别if else替代了。例如:
if(true) 1 else 0
  • 如果表达式只有一个分支,或分支的结果是Unit,它的值就是Unit
  • when表达式替代了switch case表达式,且更灵活强大。例如:
fun cases(obj:Any){
    when(obj){
        1,"one" -> print("第一项")
        in 2..10 -> println("在区间[2,10]中")
        !in validNumbers -> println("不在集合validNumbers中")
        "hello" -> print("这个字符串是hello")
        is Long -> print("这是一个Long类型的数据")
        !is String -> print("这不是一个String类型的数据")
        else -> print("else类似于Java中的default")
    }
}
  • 与if一样,when的每一个分支也可以是一个代码块,它的值是块中最后的表达式的值
  • 使用for循环遍历数组或list的三种方式:
for(arg in args){
    println(arg)
}

for(i in array.indices){
    println(args[i])
}

for((index, value) in array.withIndex()){
    println(the element at $index is $value)
}
  • 函数的返回值可以不需要显示地用return来指定,但用return的编码风格更易于阅读
  • kotlin中可以直接使用=符号来直接返回一个函数的值:
fun sum(a: Int, b: Int) = a + b
fun max(a: Int, b: Int) = if (a > b) a else b
val sum = fun (a: Int, b: Int) = a + b
sum(1,1) // 2
val sumf = fun (a: Int, b: Int) = {a + b} 
sumf(1,1).invoke() // 2
  • return语句会从最近的函数或匿名函数中返回,但是在lambda表达式中遇到return,则直接返回最近的外层函数
fun returnDemo_1(){
    println("START " + ::returnDemo_1.name)
    val intArray = intArrayOf(1,2,3,4,5)
    intArray.forEach{
        if(it == 3) return
        println(it)
    }
}
//1
//2
fun returnDemo_2(){
    println("START " + ::returnDemo_2.name)
    val intArray = intArrayOf(1,2,3,4,5)
    intArray.forEach{
        fun (a: Int){
            if(a == 3) return
            println(a)
        }
    }
}
//1
//2
//4
//5
  • 在kotlin中任何表达式都可以用标签来标记。标签的格式为标识符后跟@符号,例如abc@、jarOfLove@都是有效的标签。可以用标签来控制return、break或continue的跳转行为。Kotlin的函数是可以被嵌套的。它有函数字面量局部函数等。有了标签限制的return,就可以从外层函数返回了。例如从lambda表达式中返回,returnDemo_3()我们可以显示制定lambda表达式的return地址是其入口处:
fun returnDemo_3() {
    val intArray = intArrayOf(1,2,3,4,5)
    intArray.forEach here@ {
        if( it == 3 ) return@here //指令跳转到lambda表达式标签here@处,继续下一个it=4的遍历循环
        println(it)
    }
}
//1
//2
//4
//5
  • 上面的demo在lambda表达式开头处添加了标签here@,可以这么理解:该标签相当于是记录了lambda表达式的指令执行入口地址,然后在表达式内部就可以使用return@here来跳转至lambda表达式该地址处
  • 另外,也可以使用更加方便的隐式标签,该标签与接收该lambda的函数同名,例如:
fun returnDemo_4() {
    val intArray = intArrayOf(1,2,3,4,5)
    intArray.forEach {
        if (it == 3) return@forEach 
        println(it)
    }
}
  • 当在多层嵌套循环体中使用break时,会跳出最近外层的循环(也可用标签来显式地指出循环体的跳转地址来提高代码可读性:inner@、break@inner)。当想让break直接跳转到外层for循环,就可以使用标签了。例如:
fun breakDemo_2() {
    outer@ for (outer in 1..5) {
        for (inner in 1..10) {
            println("inner=" + inner)
            println("outer=" + outer)
            if (inner % 2 == 0){
                break@outer
            }
        }
    }
}
//inner=1
//outer=1
//inner=2
//outer=1
  • kotlin中throw是表达式,它的类型是特殊类型Nothing。该类型没有值,跟C、Java中的void意思一样。在代码中用Nothing来标记无返回的函数:
fun fail(msg:String):Nothing { throw IllegalArgumentException(msg) }

// 如果把一个throw表达式的值赋值给一个变量,需要显式声明类型为Nothing
// 另外,因为ex变量是Nothing类型,没有任何值,所以无法当做参数传给函数
val ex:Nothing = throw Exception("YYY")
  • kotlin的块注释可嵌套

END

参考资料:《Kotlin极简教程》

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

推荐阅读更多精彩内容