【发布时间】:2023-04-02 16:49:01
【问题描述】:
根据以下源代码,常规 lambda 似乎可以与扩展 lambda 互换。
fun main(args: Array<String>) {
val numbers = listOf(1, 2, 3)
filter(numbers, predicate)
filter(numbers, otherPredicate)
println("PREDICATE: ${predicate} " +
"\nOTHERPREDICATE: ${otherPredicate} " +
"\nEQUALITY: ${predicate==otherPredicate}")
}
val predicate : Int.() -> Boolean = {this % 2 != 0}
val otherPredicate : (Int) -> Boolean = {it % 2 != 0}
fun filter(list: List<Int>, predicate:(Int) -> Boolean) {
for(number in list){
if(predicate(number)){
println(number)
}
}
}
输出(我关心)如下:
PREDICATE: kotlin.Int.() -> kotlin.Boolean
OTHERPREDICATE: (kotlin.Int) -> kotlin.Boolean
EQUALITY: false
问题是为什么这些 lambda 可以互换?不应该有所不同吗?编译器是否在做一些“聪明”的事情?
【问题讨论】:
标签: lambda kotlin extension-methods