2017-10-01 4 views
0

Comment faire une déclaration Kotlin à lambda?Kotlin: Déclaration à Lambda

Je sais que vous pouvez faire:

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

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

Est-il possible de créer un lambda anonyme sans les accolades {...}?

En particulier dans une instruction switch, la manière habituelle avec des accolades ne semble pas bonne.

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

    return when (i) { 

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

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

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

Dans l'attente de votre réponse!

Répondre

3

Les accolades sont syntax pour une expression lambda, vous ne pouvez pas en créer une sans elles.

Dans une instruction when, vous pouvez donner à votre branche un corps de bloc, et renvoyer le lambda comme dernière expression, ou vous pouvez avoir une seule branche d'expression renvoyant un lambda en l'enveloppant entre parenthèses (sinon il serait interprété comme une branche qui exécute le code dans les accolades):

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") }) 
} 
2

Si vous aimez ni {{ ni ({ de la réponse de zsmb13, vous pouvez le faire paraître un peu plus agréable en définissant une fonction plutôt trivial:

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

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

Ceci est sans accolades et regarder mieux.

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