я думаю, что этот вопрос несколько связан с Kotlin function declaration: equals sign before curly bracesКотлин: Фигурные скобки вокруг нескольких выражений (или заявления)
В Scala, каждое высказывание является выражением (возможно, с Unit
типа). Если мы окружаем несколько выражений фигурными скобками, то окончательное выражение представляет собой фактическое значение фигурной скобки. Таким образом,
// Scala
val a = {
val b = 1
val c = b + b
c + c
}
println(a)
Тип a
является Int
и код выводит значение 4
.
Однако в Котлине это несколько другое. Если мы делаем то же самое в Котлин,
// Kotlin
val a = {
val b = 1
val c = b + b
c + c
}
println(a)
Тип a
является () -> Int
и код печатает Function0<java.lang.Integer>
, что означает 0-кратную функциональный объект с результатом типа Int
.
Так что, если мы хотим напечатать значение 4
, нам нужно сделать println(a())
.
Фактически, выражение {}
в Котлине является функцией () ->()
.
Я не могу найти объяснения об этом на официальных страницах справочника Kotlin. Без списка параметров или ->
фигурные скобки выполняют функцию?
Когда я использую Scala, я пишу много кодов, таких как первый код. Однако в Kotlin он создает объект функции, и мы должны вызывать функцию, которая может быть накладными расходами в цикле или рекурсии.
Есть ли какой-либо документ об этой вещи: только фигурные скобки сделать функциональный объект?
Любой способ обхода накладных расходов во втором коде, если он используется много раз?
EDIT
Вот фактический код, который перебирает много раз:
в Java
while ((count = input.read(data, 0, BYTE_BLOCK_SIZE)) != -1) {
....
}
в Scala
while {
count = input.read(data, 0, BYTE_BLOCK_SIZE)
count != -1
} {
....
}
в Котлин
while ({
count = input.read(data, 0, BYTE_BLOCK_SIZE)
count != -1
}()) {
...
}
Вы можете видеть, только Котлин делает много функциональных объектов и называет их.
Параметр 'while' код не будет идиоматическим для чтения. Разве не лучше использовать (буферизованные) потоки для этого? – voddan