Kotlin:使用地图变换时 {} 和 () 之间的区别?

Dhr*_*dha 2 kotlin

我是科特林新手。我总是使用带花括号的地图变换。然后 -

为什么这有效 ->

val x = someList.map(::SomeConstructor)
Run Code Online (Sandbox Code Playgroud)

这不是吗?

val x = someList.map{ ::SomeConstructor }
Run Code Online (Sandbox Code Playgroud)

我在在线教程的任何地方都没有找到带圆括号的地图的用法。

请尽量详细解释一下,或者提供合适的参考文章。

ama*_*nin 6

您所问的问题在这个官方文档中有解释。

且仅当函数的最后一个参数是 lambda 时,您可以从调用括号中提取它,将其内联到函数的右侧。它允许更好的 DSL 语法。

编辑:让我们举个例子:

良好的用例之一是上下文编程。想象一下你有一个可关闭的物体。您想要限制其使用,以确保在不再需要时正确关闭它。在 Java 中,你有 try-with-resources:

try (final AutoCloseable myResource = aquireStuff()) {
  // use your resource here.
}
Run Code Online (Sandbox Code Playgroud)

Kotlin 提供了该use功能。现在,您可以执行以下任一操作:

acquireStuff().use( { doStuff1(it) ; doStuff2(it) } )
Run Code Online (Sandbox Code Playgroud)

或写:

acquireStuff().use {
  doStuff1(it)
  doStuff2(it)
}
Run Code Online (Sandbox Code Playgroud)

它看起来像 Java try-w-resource,但可以扩展到您的任何 API。允许您设计为最终用户提供高级构造的库。

  • 这就是目标。将 lambda 函数视为在函数给定的“特定上下文”中执行的代码块。该语法使函数名称和其他参数成为代码块的前缀,从而创建某种上下文标识。 (2认同)