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
如果这篇文章对您有帮助的话
可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)