Kotlin 学习--语言基础

Kotlin 学习--语言基础

标签(空格分隔): kotlin


申明变量

var和val
var:变量申明,可变,表示这个变量可以多次赋值
val:变量声明,不可变,类似java中final定义的变量,只读,当被赋值之后就不能再赋值

fun testVariable(){
    var a = 1 //var 定义的变量是可以多次赋值的
    a = 3 //重新赋值
    println(a)
    var x = 5
    x+=1
    println("x = $x")//串模板 串可以包含模板表达式,即:可计算的代码片段,其结果链接到串中。模板表达式以美元符号($)开始,和简单的名字构成:

    val l = "kotlin" //val定义的是一旦被赋值之后就不能再赋值,类似java的final
//    l = "string" //编译器报错:val cannot be reassigned
    println(l)
    val j:Int = 1 //立即赋值
    val i = 1 //自动推断出类型
    val u : Int //没有赋值,得先确认类型
    u = 3
    println("j:$j===i:$i===u:$u")
}

编译结果

3
x = 6
kotlin
j:1===i:1===u:3

控制语句

1、if语句

在kotlin中的if语句和java中的还是有很大的区别,在kotlin中更加灵活,不当可以实现java的写法外,还能实现表达式(三元运算符),以及作为一个块的运用。

1.1与java一样的写法

var flag = 3
if (tag == flag){
    println("$flag == $tag--->true")
}else{
    println("$flag == $tag--->false")
}

1.2 kotlin中的三元运算符

其实在kotlin中并没有存在三元运算符(condiution?then:else)这种操作的。只是因为if语句的特性(if表达式会返回一个值),所以不用三元运算符,或者说可以当做三元运算符

var flag = 3
//在kotlin中直接用if...else...代替
var num = if(flag > 3) 3 else 5
println("num--->$num")

num--->5

由上可知,kotlin的if可以作为一个表达式并返回一个值

1.3作为一个块,并且最后一句为返回的值

var flag = 3
var numA = if (flag <3){
    flag = 10
    println("numA < 3 is true")
    flag
}else if (flag == 3){
    flag = 20
    println("numA = 3 is true")
    flag
}else{
    flag = 30
    println("numA > 3 is true")
    flag
}
println("numA ---> $numA")

numA = 3 is true
numA ---> 20

2、when语句

when 将它的参数和所有的分支条件顺序比较,直到某个分支满足条件。
when 既可以被当做表达式使用也可以被当做语句使用。如果它被当做表达式,符合条件的分支的值就是整个表达式的值,如果当做语句使用, 则忽略个别分支的值。
when不仅可以替代Java的switch,还比之强大许多,让我们往下看:

2.1 看先简单的替代switch

var tag = 3
when(tag){
    1 -> print(1)
    2 -> print(2)
    else -> println("else")//这里的else就是switch中的default
}

else

2.2 如果很多分支需要用相同的方式处理,则可以把多个分支条件放在一起,用逗号分隔(相当于把switch中的bread去掉):

var tag = 3
when(tag){
    1 -> print(1)
    2 -> print(2)
    3,4 -> println("tag等于3或者等于4")
    else -> println("else")
}

tag等于3或者等于4

2.3 in运算符

  • 我们也可以检测一个值在(in)或者不在(!in)一个区间或者集合中:
var tag = 6
when(tag){
    1 -> print(1)
    2 -> print(2)
    3,4 -> println("tag等于3或者等于4")
    in 5..10-> println("tag在5到10之中")
    !in 11..20-> println("tag不在11到20之中")
    else -> println("else")//这里的else就是switch中的default
}

tag在5到10之中
  • when 中使用 in 运算符来判断集合内是否包含某实例:
var item = setOf("flutter", "kotlin", "java")
when {
    "android" in item -> println("android is contains of item")
    "kotlin" in item -> println("kotlin is contains of item")
}

kotlin is contains of item

***2.4 检查值是否为指定类型的值--is

var tag = 2
when(tag){
    is Int -> println("$tag is a int")
}

2 is a int

2.5 when中不一定限定常量,也可以是任意表达式

var tag = 8
when(tag>1){
    true -> println("tag大于1")
    false-> println("tag小于1")
    else-> println("tag等于1")
}

tag大于1

2.6 不使用表达式的when语句

像上面if做为块的实例,其实可以改成when,when也可以被当做表达式

var numA = when {
    flag < 3 -> {
        flag = 10
        println("numA < 3 is true")
        flag
    }
    flag == 3 -> {
        flag = 20
        println("numA = 3 is true")
        flag
    }
    else -> {
        flag = 30
        println("numA > 3 is true")
        flag
    }
}
println("numA ---> $numA")

numA ---> 20

3、for语句

  • Kotlin废除了Java中的for(初始值;条件;增减步长)这个规则。但是Kotlin中对于for循环语句新增了其他的规则,来满足刚提到的规则。
  • for循环提供迭代器用来遍历任何东西
  • for循环数组被编译为一个基于索引的循环,它不会创建一个迭代器对象

3.1 新增规则来满足Java中的for(初始值;条件;增减步长)规则

3.1.1 until关键字 until[m,n)即大于等于m,小于n

for (i in 0 until 5){
    print("递增--->$i")
}

递增--->0递增--->1递增--->2递增--->3递增--->4

3.1.2 downTo关键字 downTo[x,y] 即小于等于x,大于等于y

for (i in 8 downTo 6){
    print("递减--->$i")
}

递减--->8递减--->7递减--->6

3.1.3 符号(' .. ') 表示递增的循环的另外一种操作,范围大于等于m,小于等于n,与until关键字对比之下,比较简明,范围不一样

for (i in 1 .. 5){
    print("..递增--->$i")
}

..递增--->1..递增--->2..递增--->3..递增--->4..递增--->5

3.1.4 设置步长 step

for (i in 3 until 12 step 3){
    print("i >>>$i \t")
}
    
i >>>3  i >>>6  i >>>9

3.2 迭代

3.2.1 遍历字符串

for (i in "abcefg"){
    print("i => $i \t")
}

i => a  i => b  i => c  i => e  i => f  i => g

3.2.2 遍历数组

var arrayList = arrayOf(1,2,3,4,5)
for (i in arrayList){
    print("i => $i \t")
}

i => 1  i => 2  i => 3  i => 4  i => 5

3.2.3 使用数组的indices属性遍历

var arrayListIndices = arrayOf(10,20,30,40,50)
for (i in arrayListIndices.indices){
    println("arrayListIndices[$i]--->"+arrayListIndices[i])
}

arrayListIndices[0]--->10
arrayListIndices[1]--->20
arrayListIndices[2]--->30
arrayListIndices[3]--->40
arrayListIndices[4]--->50

3.2.4 使用数组的withIndex()方法遍历

var arrayListWithIndex = arrayOf(10,20,30,40,50)
for ((index,value) in arrayListWithIndex.withIndex()){
    println("index-->$index \t value-->$value")
}

index-->0    value-->10
index-->1    value-->20
index-->2    value-->30
index-->3    value-->40
index-->4    value-->50

3.2.5 使用列表或数组的扩展函数遍历

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

推荐阅读更多精彩内容