1.奇怪的中括号?
前几星期在群里见群友问这种是什么鬼,kt中有这种语法吗?
但其实这种是重写的操作符,分别是重写了setter和getter,类似于list[0]=1这样
上面的两个方法声明如下:
不过这种语法很容易引起歧义,所以除非很适合的情况下不建议重写
ps:更多的操作符重载参考最下面附录1
2.一个文件中有两种OnClickListener
如果你的页面内同时使用了View的OnClickListener和Dialog的OnClickListener
一般情况下可能会将两个使用全类名,或者一个导包,另一种使用全类名,比如:
但是这样使用会比较麻烦
于是我们可以通过import并设置别名,这样就可以区分开来了
3.嵌套apply怎么调用外层的this
两个同样的作用域怎么调用this,比如:
因为他们的名字一样,所以没法this@出来
但我们可以这样给外层另设置一个名字,这样就可以了:
4.怎么中断forEach
我们知道,普通的for循环可以通过break来中断循环,forEach可以通过return@forEach来中断吗?
但其实return@forEach只会跳过当次循环,相当于continue
ps:因为这个return@forEach只是退出了当次lambda调用,而此lambda会被调用n此
而正确的做法是可以return到外层lambda,因为其forEach lambda是内联的:
5.val (a, b) = c
这个to方法是中缀方法
其实就相当于将 1.to("") 省略成了 1 to ""
ps:其实两种调用方式都可以
而val (i, s) = pair 则是解构声明
其 i 和 s 都是通过解构 pair 对象获取到的属性
其实最终调用的是 component1 和 component2 方法,和第一条一样的重载操作符
6.类型别名
注意看这两个示例方法的返回值,login2 比 login1的返回值短的多,但其实他们是一样的
CL的声明如下:
这里使用到的 typealias 表名是一个类型别名
ps:当然第二条也可以使用 typealias ,如下:
7.a()()()
这种操作称为柯里化,其原理就是一个方法调用后又返回了一个方法,然后调用这个返回值后又返回了一个方法,也属于高阶函数
这两种都可以实现相应的效果
lambda是一个fun对象
lambda2是声明了一个方法,返回的类型可以这样来看:
返回了 ()->方法 , 而这个方法的签名是 ()->Unit , 连续调用了三次后获取到最后的Unit返回值
附录1
可以被重载的操作符
1.一元操作符
表达式 | 对应的函数 |
---|---|
+a | a.unaryPlus() |
-a | a.unaryMinus() |
!a | a.not() |
a++ | a.inc() |
a-- | a.dec() |
2.二元操作符
表达式 | 对应的函数 |
---|---|
a+b | a.plus(b) |
a-b | a.minus(b) |
a*b | a.times(b) |
a/b | a.div(b) |
a%b | a.mod(b) |
a..b | a.rangeTo(b) |
3.in操作符
表达式 | 对应的函数 |
---|---|
a in b | b.contains(a) |
a !in b | !b.contains(a) |
4.索引访问操作符
表达式 | 对应的函数 |
---|---|
a[i] | a.get(i) |
a[i, j] | a.get(i, j) |
a[i_1, ……, i_n] | a.get(i_1, ……, i_n) |
a[i] = b | a.set(i, b) |
a[i, j] = b | a.set(i, j, b) |
a[i_1, ……, i_n] = b | a.set(i_1, ……, i_n, b) |
5.调用操作符
表达式 | 对应的函数 |
---|---|
a() | a.invoke() |
a(i) | a.invoke(i) |
a(i, j) | a.invoke(i, j) |
a(i_1, ……, i_n) | a.invoke(i_1, ……, i_n) |
6.广义赋值
表达式 | 对应的函数 |
---|---|
a += b | a.plusAssign(b) |
a -= b | a.minusAssign(b) |
a *= b | a.timesAssign(b) |
a /= b | a.divAssign(b) |
a %= b | a.remAssign(b), a.modAssign(b)(已弃用) |
7.相等与不等操作符
表达式 | 对应的函数 |
---|---|
a == b | a?.equals(b) ?: (b === null) |
a != b | !(a?.equals(b) ?: (b === null)) |
8.比较操作符
表达式 | 对应的函数 |
---|---|
a > b | a.compareTo(b) > 0 |
a < b | a.compareTo(b) < 0 |
a >= b | a.compareTo(b) >= 0 |
a <= b | a.compareTo(b) <= 0 |
对Kotlin或KMP感兴趣的同学可以进Q群 101786950
如果这篇文章对您有帮助的话
可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)