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中,它创建了一个函数对象,我们必须调用函数,这可能是循环或递归的开销。

  1. 有没有关于这个东西的任何文件: 只是花括号做一个函数对象

  2. 任何方法来解决第二个代码的开销,如果它被多次使用?

编辑

以下是迭代多次的实际代码:

在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

希望它会有所帮助