Kotlin学习(2)语法(1)

但是kotlin没有,所以kotlin 用的是 if() … else …这样实现三元表达式

其他的if用法和Java无异

3.2 when


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,而且可以用任意表达式作为分支条件

3.3 for循环


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)}

3.4 while循环


while 和 do…while循环语句的使用方式与C、Java语言基本一致,所以跳过

3.5 continue和break


和Java中的continue和break基本一致,所以跳过

3.6 return返回


和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肯定都是返回最近函数体的值呀

3.7 label标签


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)

}

3.8 throw表达式


在kotlin中的 throw是表达式,它的类型是特殊类型 Nothing,和C、Java中的void是一样的

另外,如果要把一个throw表达式赋值给一个变量,则需要显示的声明变量为Noting:

val ex: Nothing = throw Exception(“you wrong”)

fun fail(msg: String): Nothing {

throw IllegalArgumentException(msg)

}

4. 操作符与重载

===========================================================================

大部分的运算符、优先级都是和JAVA、C差不多,讲几个比较特别的重载和操作符。

  1. “+”的重载

""+1,是string重载了加法,输出是1

1+ "",Int并没有重载加String,所以编译会报错

  1. in操作符

in操作符等价于Java的contains()

a in b 就是 b.contains(a)

  1. Elvis操作符 ?:

Elvis操作符特定是跟null进行比较

y = x?:0 就是 val y = if(x!= null) x else 0

所以Elvis相当于也是一个三元操作符

  1. infix函数自定义中缀操作符

一个类:

data class Person(val name: String, val age: Int)

infix fun Person.grow(years: Int): Person {

return Person(name, age + years)

}

接着这可以这样调用:

更多Android高级工程师进阶学习资料

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
师进阶学习资料

进阶学习视频
[外链图片转存中…(img-QydJ8Y3h-1715577312595)]

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-jUzQAs0H-1715577312600)]

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值