Kotlin的各种骚气语法

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.一元操作符

表达式对应的函数
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
a++a.inc()
a--a.dec()

2.二元操作符

表达式对应的函数
a+ba.plus(b)
a-ba.minus(b)
a*ba.times(b)
a/ba.div(b)
a%ba.mod(b)
a..ba.rangeTo(b)

3.in操作符

表达式对应的函数
a in bb.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] = ba.set(i, b)
a[i, j] = ba.set(i, j, b)
a[i_1, ……, i_n] = ba.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 += ba.plusAssign(b)
a -= ba.minusAssign(b)
a *= ba.timesAssign(b)
a /= ba.divAssign(b)
a %= ba.remAssign(b), a.modAssign(b)(已弃用)

7.相等与不等操作符

表达式对应的函数
a == ba?.equals(b) ?: (b === null)
a != b!(a?.equals(b) ?: (b === null))

8.比较操作符

表达式对应的函数
a > ba.compareTo(b) > 0
a < ba.compareTo(b) < 0
a >= ba.compareTo(b) >= 0
a <= ba.compareTo(b) <= 0

对Kotlin或KMP感兴趣的同学可以进Q群 101786950

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

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

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值