Kotlin的各种骚气语法

285 阅读4分钟

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

如果这篇文章对您有帮助的话

可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)