Kotlin:对Lambda的陈述

时间:2017-10-01 17:05:32

标签: lambda kotlin

如何向lambda发表Kotlin声明?

我知道你可以这样做:

fun foo() : () -> Unit {
    return { println("Hello World") }
}

//more beautiful:
fun foo() : () -> Unit = { println("Hello World") }

是否也可以创建一个没有大括号{...}的匿名lambda?

特别是在switch语句中,大括号的常用方法看起来不太好。

fun bar(i: Int) : () -> Unit {

    return when (i) {

        0 -> { { println("Hello") } }

        1 -> { { println("World") } }

        else -> { { println("Bye") } }
    }
}

期待您的回复!

4 个答案:

答案 0 :(得分:3)

curly大括号是lambda表达式的syntax,没有它们就不能创建一个。

when语句中,你可以给你的分支一个块体,并返回lambda作为它的最后一个表达式,或者你可以让一个表达式分支通过将它包装在括号中来返回一个lambda(否则它将被解释为执行大括号内的代码的分支:

when (x) {
    "block body returning an Int" -> {
        // do stuff
        25
    }
    "block body returning a lambda" -> {
        // do stuff
        { println("Hello") }
    }
    "single expression returning an Int" -> 25
    "single expression returning a lambda" -> ({ println("Hello") })
}

答案 1 :(得分:2)

如果你不同意zsmb13的答案中的{{({,你可以通过定义一个相当简单的函数使它看起来更好一些:

fun <A> lambda(x: A) = x

// usage
return when (i) {
    0 -> lambda { println("Hello") }
    1 -> lambda { println("World") }
    else -> lambda { println("Bye") }
}

答案 2 :(得分:0)

这没有花括号,看起来更好。

fun getDayType(day: String): String {
return  when (day) {
        "SATURDAY" -> "Half Day"
        "SUNDAY" -> "Holyday"
        else -> "running day"
    }
}

答案 3 :(得分:0)

when用作表达式时,必须返回一个值If it is used as an expression, the value of the satisfied branch becomes the value of the overall expression (Just like with if, each branch can be a block, and its value is the value of the last expression in the block.),如果您查看when-expression的语法,可以看出它是由when条目的右部由controlStructerBodies组成,并且它们由块组成,因此,当您仅使用一对花括号{}时,Kotlin将其识别为block,其返回value是代码块中的最后一个表达式,因此,要使其成为lambda,则需要第二对花括号。

返回一个lambda,因为它是块内的最后一个也是唯一的表达式:

    fun returnLambda(choice: Boolean): ()-> String {
        return when (choice) {
            true ->  {{"Hello"}}
            false -> {{"World"}}
        }

    }

返回一个String,因为它是块内的最后一个表达式:

fun returnString(choice: Boolean): String{
    return when(choice){
        true -> {"Hello"}
        false -> {"world"}
    }
}

这样,您可以执行不同的表达式并在同一块中返回值:

fun returnString(choice: Boolean): String {
    return when (choice) {
        true -> {
            println("Hello")
            println("world")
            "Hello"
        }
        false -> {
            "world"
        }
    }
}