返回与跳转

回到目录
项目源码 kotlin-basics 项目


break

break 用来结束循环, 默认只返回一层循环.

    @Test fun testBreak() {
        // 声明一个 list, Kotlin 中不需要 new 关键字的
        val list = ArrayList()
        for(a in 1..3) {
            for(b in 1..3) {
                list.add(b)
                if(b == 2)
                    break
            }
        }
        assertTrue(list.size == 6) // list 中应该是 1, 2, 1, 2, 1, 2
    }

可以用标签语法 label@ 标记位置, 然后用 break@label 指定返回位置.

    @Test fun testBreakLabel() {
        val list = ArrayList()
        outer@for(a in 1..3) {
            inner@for(b in 1..3) {
                list.add(b)
                if(b == 2)
                    break@outer // 跳出 outer 标签
            }
        }
        assertTrue(list.size == 2) // list 中应该是 1, 2
        assertTrue(list[0] == 1)
        assertTrue(list[1] == 2)
    }

continue 同理

return

return 用来返回函数结果. 下面的 forEach 接收一个类型为 (T) -> Unit 的参数.

    fun foo(): ArrayList {
        val list = ArrayList()
        (1..5).forEach lable@{
            if(it == 3) return@lable
            list.add(it) // list 里应该是 1, 2, 4, 5
        }
        return list
    }

    @Test fun testReturn() {
        val result = foo()
        assertEquals(4, result.size)        
        assertTrue(result[0] == 1)
        assertTrue(result[1] == 2)
    }

可以使用隐式标签, 与接收该 lambda 的函数同名:

 /**
     *  或者直接用隐式标签
     */
    fun bar(): ArrayList {
        val list = ArrayList()
        (1..5).forEach {
            if(it == 3) return@forEach // 与 forEach 同名
            list.add(it) // list 里应该是 1, 2, 4, 5
        }
        return list
    }
    @Test fun testReturnImpl() {
        val result = bar()
        assertEquals(4, result.size)
        assertTrue(result[0] == 1)
        assertTrue(result[1] == 2)
    }

也可以用匿名函数代替 lambda, 这时匿名函数内的 return 会返回到匿名函数的调用者.

回到目录

你可能感兴趣的:(返回与跳转)