when
表达式和Java中的 switch..case
是类似的。
因为kotlin是极简风格变成,所以它的when比switch写起来更加方便,下面一个例子:
fun caseWhen(obj: Any?) {
when (obj) {
0, 1, 2, 3 -> print(“是0123中的一个”)
“你好” -> print(“是你好”)
else -> print(“什么都不是”)
}
}
其中的 else
相当于 switch-case
中的 default
可以看出来 when语句不用写那么多case,而且可以用任意表达式作为分支条件
for循环可以对任何提供迭代器的对象进行遍历
//用in 遍历
for(item in collection){
…
}
//用索引遍历数组或者list 其中indices存储了数组array的下标
for(i in array.indices){
print(array[i])
}
indices
存储了数组的下标。我们也可以用withIndex
来遍历下标与对应的元素:
for((index,value) in array.withIndex){
println(“the element at $index is $value”)
}
另外,范围(Ranges)表达式也可以用于循环中:
for(i in 1…10){
println(i)
}
//简写代码为
(1…10).forEach { println(it)}
while 和 do…while循环语句的使用方式与C、Java语言基本一致,所以跳过
和Java中的continue和break基本一致,所以跳过
和Java一样,有返回值的函数要显示的用 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,2)
上面的最后一个例子是直接使用表达式来实现函数。需要注意的是,后面的函数体语句中有没有大括号代表的意义完全不同。
比如这样的Lambda表达式:
//这样子声明,sumf就是一个高阶函数
val sumf = fun(a: Int, b: Int) = { a + b }
//直接调用的并不会返回结果而是返回一个函数体
sumf(1,2)
() -> kotlin.Int
//如果要调用,得使用invoke方法, 或者 (),它和invoke等价
sumf(1,2).invoke()
sumf(1,2)()
3
如果有括号,就又相当于多了一层函数。直接调用 sumf(1,2)返回的并不是一个int值,而你要在 sum(1,2)的基础上,再去调用一遍方法,才能返回一个int值。
如果有Lambda,则里面的return直接返回最近的外层函数,这个其实很好理解的,return肯定都是返回最近函数体的值呀
Kotlin中的任何表达式都可以用 标签(label)标记,标签的格式为标识符后跟@符号
比如 hello@、key@都是有效的标签。
我们可以用 label标签来控制return、break或continue语句的跳转行为。比如:
val intArray = intArrayOf(1, 2, 3, 4, 5)
//here@ 是下一个标签
intArray.forEach here@{
if (it == 3)
//执行指令跳到Lambda表达式标签here@处。进行下一个it=4的遍历循环
return@here
println(it)
}
2019-10-30 10:41:40.929 13461-13461/com.rikkatheworld.mykotlindemo I/System.out: 1
2019-10-30 10:41:40.929 13461-13461/com.rikkatheworld.mykotlindemo I/System.out: 2
2019-10-30 10:41:40.929 13461-13461/com.rikkatheworld.mykotlindemo I/System.out: 4
2019-10-30 10:41:40.929 13461-13461/com.rikkatheworld.mykotlindemo I/System.out: 5
here@
其实就是一个传送门,当遇到一定情况的时候,使用 return@here
,就可以跳到 here@
处
也可以使用隐式标签,该标签与接收该Lambda的函数同名:
val intArray = intArrayOf(1, 2, 3, 4, 5)
intArray.forEach {
if (it == 3)
return@forEach
println(it)
}
在kotlin中的 throw是表达式,它的类型是特殊类型 Nothing
,和C、Java中的void
是一样的
另外,如果要把一个throw表达式赋值给一个变量,则需要显示的声明变量为Noting:
val ex: Nothing = throw Exception(“you wrong”)
fun fail(msg: String): Nothing {
throw IllegalArgumentException(msg)
}
===========================================================================
大部分的运算符、优先级都是和JAVA、C差不多,讲几个比较特别的重载和操作符。
- “+”的重载
""+1
,是string重载了加法,输出是1
1+ ""
,Int并没有重载加String,所以编译会报错
- in操作符
in操作符等价于Java的contains()
a in b
就是 b.contains(a)
- Elvis操作符 ?:
Elvis操作符特定是跟null进行比较
y = x?:0
就是 val y = if(x!= null) x else 0
所以Elvis相当于也是一个三元操作符
- infix函数自定义中缀操作符
一个类:
data class Person(val name: String, val age: Int)
infix fun Person.grow(years: Int): Person {
return Person(name, age + years)
}
接着这可以这样调用:
val rikka = Person(“rikka”, 20)
//直接调用函数
print(rikka.grow(2))
//中缀表达式调用方式
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
转存中…(img-TbxRxriT-1715680413989)]
[外链图片转存中…(img-i99wf3eu-1715680413992)]
[外链图片转存中…(img-K9rXVdMV-1715680413994)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!