Kotlin: llaves de varias expresiones (o declaraciones)

Creo que esta pregunta está relacionada de alguna manera con la statement de la function de Kotlin: es igual al signo antes de las llaves

En Scala, cada enunciado es una expresión (posiblemente con tipo de Unit ). Si rodeamos expresiones múltiples con llaves, entonces la expresión final es el valor real de la parte con rizado. Por lo tanto,

 // Scala val a = { val b = 1 val c = b + b c + c } println(a) 

El tipo de a es Int y el código imprime el valor 4 .

Sin embargo, en Kotlin, esto es algo diferente. Si hacemos lo mismo en Kotlin,

 // Kotlin val a = { val b = 1 val c = b + b c + c } println(a) 

El tipo de a es () -> Int y el código imprime la Function0<java.lang.Integer> , que significa un object de function 0-ary con el tipo de resultado Int .

Entonces, si queremos imprimir el valor 4 , necesitamos hacer println(a()) .

De hecho, la expresión {} en Kotlin es una function () -> () .

No puedo encontrar una explicación sobre esto en las páginas de reference oficiales de Kotlin. Sin una list de parameters o -> , las llaves forman una function?

Cuando uso Scala, escribo muchos códigos como el primer código. Sin embargo, en Kotlin, crea un object de function y tenemos que llamar a la function, que puede ser una sobrecarga en un bucle o recursión.

  1. ¿Hay algún documento sobre esto: solo las llaves forman un object de function ?

  2. ¿Hay alguna manera de solucionar los gastos generales en el segundo código si se usa muchas veces?

EDITAR

Aquí está el código real que se repite muchas veces:

en Java

 while ((count = input.read(data, 0, BYTE_BLOCK_SIZE)) != -1) { .... } 

en Scala

 while { count = input.read(data, 0, BYTE_BLOCK_SIZE) count != -1 } { .... } 

en Kotlin

 while ({ count = input.read(data, 0, BYTE_BLOCK_SIZE) count != -1 }()) { ... } 

Como puedes ver, solo Kotlin fabrica una gran cantidad de objects funcionales y los llama.

En Kotlin {} son siempre una expresión lambda o una parte de una construcción de syntax como while(true) {} . Probablemente diferente de Scala, pero fácil de comprender, no obstante.

Lo que probablemente quieras es:

 val a = run { val b = 1 val c = b + b c + c } println(a) 

Kotlin no tiene un concepto incorporado de "bloques de código en cualquier lugar". En su lugar usamos funciones estándar-ayudantes como run en el ejemplo anterior.

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/run.html

Si {} define una function, puede llamar a la function al declararla, lo que la evaluará inmediatamente:

 val a = { val b = 1 val c = b + b c + c }() println(a) 

impresiones 4 . (Tenga en count el () al final del bloque)

En Scala, cada statement es una expresión (posiblemente con el tipo de unidad)

Eso no es exactamente cierto. Comprobar: ¿todo es una function o expresión u object en Scala?

Como Zoltan dijo, {} define funciones así que en lugar de:

 // Kotlin val a = { val b = 1 val c = b + b c + c } println(a) 

debería ser:

 // Kotlin val a = { val b = 1 val c = b + b c + c } println(a()) //you defined a function, which returns `4`, not expression 

o

 // Kotlin val a = { val b = 1 val c = b + b c + c }() //note these braces println(a) 

Si desea imprimir un valor, no function, puede intentar declarar la variable y luego usar una de las funciones de Kotlin para cambiar un valor como en el siguiente ejemplo:

 var sum = 0 ints.filter { it > 0 }.forEach { sum += it } print(sum) 

Leer: Funciones de order superior y Lambdas

Espero que ayude