kotlin小ネタ:forEach から break っぽいことを行う

このようなコードを無理やり forEach でやろうと思った場合、

for (v in 0..1) {
    println(v)
    break
}

こんな感じになる。

// forEach からの break っぽいことを行う例
fun main(args: Array<String>) {
    fun foo() {
        
        // label は expression に設定する必要があるので、forEach の外部に便宜的な
        // place holder 用の lambda expression を用意する。
        run exit@ {
            
            (0..1).forEach {
                
                // 下記で forEach から抜けなければ "0", "1" と表示される。
                // 実際には抜けてしまうので "0" のみが表示される。
                println(it)
                
                // 外側の forEach を抜ける
                return@exit
            }
        }
        
    }
    
    foo() // 出力は "0" のみ
}

label は expression に対して設定するので以下のようにもできる。

fun main(args: Array<String>) {
    val expression = exit@ {
        (0..1).forEach {
            // 下記で forEach から抜けなければ "0", "1" と表示される。
            // 実際には抜けてしまうので "0" のみが表示される。
            println(it)
            
            // 外側の forEach を抜ける
            return@exit
        }
    }
    
    fun foo() {
        expression()
    }
    
    foo() // 出力は "0" のみ
}