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() }怎么办?
有办法吗?有什么区别?提前致谢
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()返回一个布尔值,则该函数是有效的。但它没有,所以它是无效的。
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |