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