Retorno implícito de lambda en Kotlin

Parece que la última línea de un lambda siempre devuelve ese valor incluso si omite la statement de return . ¿Es esto correcto? Está documentado en cualquier lugar?

 fun main(args: Array<String>) { val nums = arrayOf(1, 2, 3) val numsPlusOne = nums.map { it -> val r = it + 1 r } // numsPlusOne = [2, 3, 4] } 

Sí, esto es correcto, si la última statement de una lambda es una expresión, se considera su valor de retorno.

Esto es lo que dice la reference (gracias @KirillRakhman ):

Podemos devolver explícitamente un valor de la lambda utilizando la syntax de retorno calificada . De lo contrario, el valor de la última expresión se devuelve implícitamente. Por lo tanto, los dos fragments siguientes son equivalentes:

 ints.filter { val shouldFilter = it > 0 shouldFilter } 

 ints.filter { val shouldFilter = it > 0 return@filter shouldFilter } 

La semántica de la última statement también es válida para if (es por eso que no hay operador ternario) , when y trycatch bloquea, y estas declaraciones son expresiones en sí mismas:

 val foo = if (bar) { doSomething() baz } else { doSomethingElse() qux } 

Ver también: ejemplos para when y trycatch .

Entonces, lambdas son consistentes con los constructos del lenguaje en este sentido.


Si desea crear una statement de return explícita en una lambda, use la syntax de la return@label (también, otra respuesta con ejemplos ). El return no labeldo, por el contrario, funciona con la fun más cercana (ignorando las lambdas) y, por lo tanto, solo puede ocurrir en las lambdas que están en línea .

Hubo una propuesta de idioma para agregar syntax especial para emitir un valor desde un bloque de código, pero fue rechazado.

  • Referencia no resuelta: kotlinx
  • Fusionar observables dependientes
  • ¿Cómo declaro un parámetro de function para aceptar funciones que arrojan?
  • ClassNotFoundException en sabor personalizado usando kotlin
  • ¿Cómo usar @DbEnumValue con Ebean en Kotlin?
  • ¿Por qué Kotlin Lang permite solo una function principal en el proyecto?
  • Retrofit2 y kotlin
  • Genéricos de Kotlin e inferencias de types incorrectos
  • Autenticación Firebase de Android
  • Desplazamiento suave en JavaFX TableView
  • ActivityTestRule.getActivity devuelve nulo en el método Before