kotlin的一些返回语法

326 阅读2分钟

Kotlin中的一些返回语法

前言

我们都知道lambda表达式禁止非局部的返回,如下所示

这时候会提示我们 'return' is not allowed here,这是因为kotlin规定,在lambda中不能使用这种非局部的返回,但是必须要中断这个逻辑怎么办呢?可以用以下写法

在return关键字后面加上@test,就可以实现局部返回的效果。这个就是kotlin的标签。

标签的使用

kotlin中的任何表达式都可以用标签标识,标签的格式为表达式后面跟@符号,如下所示

这样,标签就标记了这一处地方,在我的实际用途中,主要是用来做非局部的返回,中断局部逻辑。

为什么有的地方需要手动添加标签,比如上图所示,但是有的地方就不用呢?比如我们常用的点击事件,就不需要手动添加标签呢?

tvShow.setOnClickListener {
if (xx == 0) {
        return@setOnClickListener
    }
} 

其实这叫做隐式标签,该标签与接受该lambda的函数同名。所以一般接受lambda的函数里,都可以直接调用隐式标签进行返回,常用的continue和break关键字原理也是这种隐式标签。

局部返回与非局部返回

所谓非局部返回,就是直接return,将程序逻辑直接中断至包含它的函数。而非局部返回就是仅仅中断一小部分的逻辑。

lambda非局部返回

为什么lambda表达式禁止非局部返回?

因为lambda不能使包含它的函数返回。

inline函数中的lambda表达式为什么不禁止非局部返回?

如果lambda传给的函数是inline修饰的,那么该lambda表达式就可以使用return,因为inline修饰的函数,经过编译后,是直接挪到了调用该inline函数的地方,那return的逻辑就非常明了,就是要中断调用inline函数的函数。

crossInline修饰的lambda为什么又禁止了?

crossinline的主要作用就是禁止非局部返回,这相当于给用户了一个选择权,如果不需要非局部返回,就添加crossInline修饰,反之,就不需要添加。