更直接地回答:是的...predicate.test(it) 或几乎等效的方法参考predicate::test 是要走的路...除了...
如果您必须更频繁地处理 Java 谓词和/或将来计划将 Java 函数类型(例如 Predicate)重构为 Kotlin 函数类型,您可能还想添加适当的扩展函数,例如:
fun <T> Iterable<T>.filter(predicate: Predicate<T>) = filter { predicate.test(it) }
然后使用以下用法:
val javaPredicate : Predicate<String> = Predicate { it == "hello" }
listOf("hello", "world")
.filter(javaPredicate)
如果您将来将 Predicate 替换为,例如(T) -> Boolean 然后您不需要调整该过滤器,只需将导入语句替换/删除扩展函数即可。
扩展函数也可以将 Predicate 转换为适当的 Kotlin 函数类型,但在未来的重构中可能对您没有太大帮助:
operator fun <T> Predicate<T>.invoke() : (T) -> Boolean = ::test
fun <T> Predicate<T>.transform() : (T) -> Boolean = ::test
使用示例:
val javaPredicate : Predicate<String> = Predicate { it == "hello" }
// variant with Predicate.invoke:
listOf("hello", "world")
.filter(javaPredicate())
// variant using Predicate.transform()
listOf("hello", "world")
.filter(javaPredicate.transform())
因此,我建议您使用重载的filter-方法,以防您计划重构或坚持使用filter { predicate.test(it) }/filter(predicate::test),这可能会使未来的重构变得更加困难(IDE 有帮助;-))。