Kotlin:围绕几个表达式(或语句)
我认为这个问题与Kotlin函数声明有些相关:在大括号之前的等号
在Scala中,每个语句都是一个表达式(可能带有Unit
类型)。 如果我们用大括号包围多个表达式,那么最后的表达式就是大括号部分的实际值。 因此,
// Scala val a = { val b = 1 val c = b + b c + c } println(a)
a的类型是Int
,代码打印值4
。
但是,在Kotlin,这有些不同。 如果我们在Kotlin做同样的事情,
// Kotlin val a = { val b = 1 val c = b + b c + c } println(a)
is () -> Int
的类型,代码打印Function0<java.lang.Integer>
,这意味着结果类型为Int
的0元函数对象。
所以如果我们想打印值4
,我们需要做println(a())
。
实际上,Kotlin中的表达式是一个函数() -> ()
。
在Kotlin的官方参考页面中,我找不到这个解释。 没有参数列表或->
,花括号做一个函数?
当我使用Scala时,我写了许多代码,如第一个代码。 然而,在Kotlin中,它创建了一个函数对象,我们必须调用函数,这可能是循环或递归的开销。
-
有没有关于这个东西的任何文件: 只是花括号做一个函数对象 ?
-
任何方法来解决第二个代码的开销,如果它被多次使用?
编辑
以下是迭代多次的实际代码:
在Java中
while ((count = input.read(data, 0, BYTE_BLOCK_SIZE)) != -1) { .... }
在斯卡拉
while { count = input.read(data, 0, BYTE_BLOCK_SIZE) count != -1 } { .... }
在Kotlin
while ({ count = input.read(data, 0, BYTE_BLOCK_SIZE) count != -1 }()) { ... }
你可以看到,只有Kotlin创建了许多函数对象并调用它们。
在Kotlin {}
中总是一个lambda表达式或像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类型)
这不完全正确。 检查: 一切都是一个函数或表达式或对象在斯卡拉?
正如佐尔坦所说{}
定义的功能,而不是:
// 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)
阅读: 高阶函数和Lambda
希望它会有所帮助