如何将 java.util.function.谓词实现为 Kotlin lambda?

2022-09-02 10:14:05

我需要将 a 传递给 Java 函数。如何在 Kotlin 中将其实现为 Lambda?java.util.function.Predicate

我需要调用的 Java 函数:

public void foo(Predicate<String> p)

Java Lambda implemenation ✔ :

foo(text-> true)

Kotlin Lambda implemenation ❌ :

foo{text:String -> true}  
    ^^^^^^^^^^^^ 
Type mismatch.
Required: Predicate<String>
Found:    (String) → Boolean

Kotlin-Version 1.2.21


答案 1

自 Kotlin 1.4 起

foo({text -> true  })

foo {text -> true}     

在 Kotlin 1.4 之前

这些变体的工作原理:

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

答案 2

如果想要声明为属性:

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

推荐