[英]How to implement a java.util.function.Predicate as Kotlin lambda?
我需要将java.util.function.Predicate
传递给 Java 函数。 如何在 Kotlin 中将其实现为 Lambda?
我需要调用的 Java 函数:
public void foo(Predicate<String> p)
Java Lambda 实现✔:
foo(text-> true)
Kotlin Lambda 实现❌:
foo{text:String -> true}
^^^^^^^^^^^^
Type mismatch.
Required: Predicate<String>
Found: (String) → Boolean
Kotlin 版本 1.2.21
从 Kotlin 1.4 开始
foo({text -> true })
或
foo {text -> true}
在 Kotlin 1.4 之前
这些变体有效:
foo(Predicate {text -> true })
foo(Predicate {true})
foo({true }as Predicate<String>)
它工作正常,这是一个使用 Java List
编译的测试和将Predicate
作为参数的filter
方法:
val test = Arrays.asList("Hello", "Bye", "World!")
println(test)
println(test.filter { it.startsWith("W") })
最后一个示例代码 ( foo{text:String -> true}
) 是您无法编译的代码吗?
在大括号之间,您应该传递 lambda 的实现,而不是它的类型/接口。 这部分为你推断!
从 Kotlin 1.4 开始,支持 Java 接口的单一抽象方法 (SAM) 转换: https : //kotlinlang.org/docs/reference/java-interop.html#sam-conversions
从问题中的示例来看,以下内容现在有效:
foo { text -> true }
如果要声明为属性:
private val normal = Predicate<Int> { true }
private val even = Predicate<Int> { it % 2 == 0 }
private val odd = even.negate()
fun main() {
println("Normal count ${get(normal)}")
println("Even count ${get(even)}")
println("Odd count ${get(odd)}")
}
fun get(predicate: Predicate<Int>): Int {
val filter = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).filter { predicate.test(it)}
println(filter)
val map = filter.map { it * 2 }
println(map)
return map.sum()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.