如何实现java.util.function.Predicate作为Kotlin lambda?

时间:2018-02-16 14:13:48

标签: java lambda kotlin

我需要将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-Version 1.2.21

4 个答案:

答案 0 :(得分:6)

这些变体适合我:

foo(Predicate {text -> true  })  
foo(Predicate {true})
foo({true  }as Predicate<String>)

答案 1 :(得分:0)

它工作正常,这是一个用Java Listfilter方法编译的测试,它以Predicate为参数:

val test = Arrays.asList("Hello", "Bye", "World!")
println(test)
println(test.filter { it.startsWith("W") })

最后一个示例代码(foo{text:String -> true})是不能编译的代码吗?

在大括号之间,你应该传递lambda的实现,而不是它的类型/接口。这部分是为您推断的!

答案 2 :(得分:0)

从Kotlin 1.4开始,支持Java接口的单一抽象方法(SAM)转换: https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

从问题中的示例开始,以下内容现已生效:

foo { text -> true }

答案 3 :(得分:0)

如果要声明为属性:

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()
}