Kotlin 中的 filter() 和 {} 有什么区别

Kir*_*nov 0 lambda predicate filter kotlin

我正在学习 Kotlin,并且在理解带括号和花括号的过滤器之间的区别时遇到了一些困难。如果我检查过滤器实现,Intellij 会将我重定向到同一个源。

代码示例:

listOf("john", "dave").filter { name -> name.startsWith("j") }

// versus

// simple predicate function
fun getSimplePredicate(): (String) -> Boolean = 
  name: String -> name.firstName.startsWith(prefix)

// actual filter call
listOf("john", "dave).filter(getSimplePredicate())
Run Code Online (Sandbox Code Playgroud)

如果我想以某种方式打电话filter { getSimplePredicate() }怎么办?

有办法吗?有什么区别?提前致谢

JB *_*zet 5

filter() 需要一个谓词函数作为参数,即一个接受字符串并返回布尔值的函数。

在 Kotlin 中,如果函数的最后一个参数(此处为 filter)是一个函数(谓词),那么您可以传递一个 lambda,并且 lambda 可以在括号之外。所以

.filter { ... }
Run Code Online (Sandbox Code Playgroud)

是相同的

.filter({ ... })
Run Code Online (Sandbox Code Playgroud)

因此,在您的代码中,{ name -> name.startsWith("j") }是一个 lambda,它是传递给filter().

该函数getSimplePredicate() 返回一个谓词函数。

So.filter(getSimplePredicate())等价于.filter({ name.firstName.startsWith(prefix) }),即等价于.filter { name.firstName.startsWith(prefix) }

.filter { getSimplePredicate() }如果{ getSimplePredicate() }是一个返回布尔值的函数,即如果getSimplePredicate()返回一个布尔值,则该函数是有效的。但它没有,所以它是无效的。