如何向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") } }
}
}
期待您的回复!
答案 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"
}
}
}