Kotlin 中的 Lambda 混淆,它 == x vs equals(x)
Lambda confusion in Kotlin, it == x vs equals(x)
我正在做一个简单的测试来了解为什么我的代码不工作。
val v = listOf("1", "2", "2", "3")
assertThat((v.filter { equals("2") }).size , `is`(2))
它失败了,原因是 "size is 0"
但是当我将其更改为:
val v = listOf("1", "2", "2", "3")
assertThat((v.filter { it == "2" }).size , `is`(2))
在Java我可以做到:
.filter(Objects::equals)
这是returns预期的结果。任何人都可以理解为什么会出现这种行为???
你需要写的是
assertThat((v.filter { it.equals("2") }).size , `is`(2))
尽管请注意,如果启用了 'Can be replaced with binary operator' 检查,IntelliJ 会立即建议用 ==
替换 equals
调用。
此外,不,您不能将此特定调用写为 Java 中的 .filter(Objects::equals)
,因为静态 Objects#equals
需要 2 个参数,而方法 filter
仅为其 lambda 参数提供 1。但是您仍然可以在 Kotlin 中使用函数引用(具有预期的 lambda 的适当函数)。例如,您可以像这样过滤所有非空字符串:
val v = listOf("1", "", "2", " ", "\t", "3")
println(v.filter(String::isNotBlank))
我正在做一个简单的测试来了解为什么我的代码不工作。
val v = listOf("1", "2", "2", "3")
assertThat((v.filter { equals("2") }).size , `is`(2))
它失败了,原因是 "size is 0"
但是当我将其更改为:
val v = listOf("1", "2", "2", "3")
assertThat((v.filter { it == "2" }).size , `is`(2))
在Java我可以做到:
.filter(Objects::equals)
这是returns预期的结果。任何人都可以理解为什么会出现这种行为???
你需要写的是
assertThat((v.filter { it.equals("2") }).size , `is`(2))
尽管请注意,如果启用了 'Can be replaced with binary operator' 检查,IntelliJ 会立即建议用 ==
替换 equals
调用。
此外,不,您不能将此特定调用写为 Java 中的 .filter(Objects::equals)
,因为静态 Objects#equals
需要 2 个参数,而方法 filter
仅为其 lambda 参数提供 1。但是您仍然可以在 Kotlin 中使用函数引用(具有预期的 lambda 的适当函数)。例如,您可以像这样过滤所有非空字符串:
val v = listOf("1", "", "2", " ", "\t", "3")
println(v.filter(String::isNotBlank))