如何以Kotlin Lambda实现java.util.function.Predicate并传入Java函数
在Kotlin 1.2.21中用Lambda实现Java的Predicate并传入Java函数
嘿,这个问题我熟!在Kotlin 1.2.21版本里,要把Kotlin Lambda转换成Java的java.util.function.Predicate传给Java函数,确实得做一点点小处理——毕竟早期Kotlin对Java函数式接口的自动适配还没那么智能,不像Java Lambda能直接无缝对接。下面给你两种靠谱的实现方式:
方式一:显式转换Kotlin Lambda为Predicate
如果你的Java函数接受Predicate<T>作为参数,直接传Kotlin Lambda编译器可能会懵,这时候加个显式的类型转换就行。举个例子:
先看Java侧的函数定义(假设是工具类里的过滤方法):
import java.util.List; import java.util.function.Predicate; public class JavaFilterUtil { public static <T> List<T> filterItems(List<T> items, Predicate<T> filterCondition) { return items.stream().filter(filterCondition).toList(); } }
然后在Kotlin里这样调用:
val numberList = listOf(1, 2, 3, 4, 5, 6) // 用尾随Lambda语法,显式转换为Predicate<Int> val evenNumbers = JavaFilterUtil.filterItems(numberList) { it % 2 == 0 } as Predicate<Int> // 或者在参数位置直接转换 val oddNumbers = JavaFilterUtil.filterItems(numberList, { it % 2 != 0 } as Predicate<Int>)
方式二:直接创建Predicate实例
这种方式更直观,直接用Kotlin的SAM构造器创建Predicate对象,编译器完全不会出错:
val numberList = listOf(1, 2, 3, 4, 5, 6) // 先定义Predicate实例 val startsWith3Predicate = Predicate<Int> { it.toString().startsWith("3") } // 传入Java函数 val filteredNumbers = JavaFilterUtil.filterItems(numberList, startsWith3Predicate)
为什么Java Lambda可以直接用?
因为Java里Predicate是标准的函数式接口,Java Lambda会自动适配成Predicate的实现;但Kotlin 1.2里的Lambda默认对应Kotlin自己的函数类型(比如(Int) -> Boolean),和Java的Predicate<T>不是一回事,所以需要显式转换或者通过SAM构造器来衔接。
内容的提问来源于stack exchange,提问作者Chriss
相关产品推荐
相关产品推荐

