Котлин: фигурные скобки вокруг нескольких выражений (или высказываний)

Я думаю, что этот вопрос несколько связан с объявлением функции Котлина: знак равенства перед фигурными фигурными скобками

В Scala каждое выражение является выражением (возможно, с типом Unit ). Если мы окружаем несколько выражений фигурными скобками, то окончательное выражение представляет собой фактическое значение фигурной скобки. Следовательно,

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

Тип aInt а код печатает значение 4 .

Однако в Котлине это несколько другое. Если мы сделаем то же самое в Котлине,

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

Тип a is () -> Int и код печатает Function0<java.lang.Integer> , что означает 0-арный объект функции с типом результата Int .

Поэтому, если мы хотим напечатать значение 4 , нам нужно сделать println(a()) .

Действительно, выражение {} в Котлине есть функция () -> () .

Я не могу найти объяснения об этом на официальных страницах ссылок Котлин. Без списка параметров или -> , фигурные скобки выполняют функцию?

Когда я использую Scala, я пишу много кодов, таких как первый код. Однако в Kotlin он создает объект функции, и мы должны вызвать функцию, которая может быть накладными расходами в цикле или рекурсии.

  1. Есть ли какой-либо документ об этом: только фигурные скобки создают объект функции ?

  2. Любой способ обхода накладных расходов во втором коде, если он используется много раз?

РЕДАКТИРОВАТЬ

Вот фактический код, который повторяется много раз:

в Java

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

в Скале

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

в Котлине

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

Вы можете видеть, что только Котлин делает много функциональных объектов и называет их.

В Kotlin {} всегда есть лямбда-выражение или часть конструкции синтаксиса, например while(true) {} . Вероятно, отличается от Scala, но легко понять, тем не менее.

Вероятно, вы хотите:

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

У Kotlin нет встроенной концепции «кодовых блоков в любом месте». Вместо этого мы используем стандартные функции-помощники, например, run в приведенном выше примере.

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

Если {} определяет функцию, вы можете просто вызвать функцию после ее объявления, которая сразу же оценит ее:

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

отпечатки 4 . (Обратите внимание на () в конце блока)

В Scala каждое выражение является выражением (возможно, с типом Unit)

Это не совсем так. Проверка: все ли функция или выражение или объект в scala?

Как сказал Золтан, {} определяет функции, а вместо:

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

должен быть:

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

или

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

Если вы хотите напечатать значение, а не функцию, вы можете попытаться объявить переменную, а затем использовать одну из функций Kotlin для изменения значения, как в примере ниже:

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

Читайте: Функции более высокого порядка и Lambdas

Надеюсь, это поможет