Путаница лямбда в Kotlin, она == х против равно (х) - PullRequest
4 голосов
/ 03 февраля 2020

Я делаю простой тест, чтобы понять, почему мой код не работает.

    val v = listOf("1", "2", "2", "3")
    assertThat((v.filter { equals("2") }).size , `is`(2))

он не работает по причине "размер равен 0"

, но когда я изменяю его на :

    val v = listOf("1", "2", "2", "3")
    assertThat((v.filter { it == "2" }).size , `is`(2))

В Java Я мог бы сделать:

.filter(Objects::equals)

Возвращает ожидаемый результат. Кто-нибудь может понять, почему это поведение ???

1 Ответ

1 голос
/ 04 февраля 2020

Вам нужно написать

    assertThat((v.filter { it.equals("2") }).size , `is`(2))

, хотя учтите, что IntelliJ немедленно предложит заменить вызов equals на ==, если у вас включена проверка «Может быть заменена двоичным оператором».

Кроме того, нет, вы не сможете записать этот указанный вызов c как .filter(Objects::equals) в Java, потому что stati c Objects#equals принимает 2 параметра, а метод filter предоставляет только 1 для своего лямбда-аргумента. Но вы все еще можете использовать ссылки на функции в Kotlin (с соответствующими функциями для ожидаемой лямбды). Например, вы можете отфильтровать все непустые строки следующим образом:

    val v = listOf("1", "", "2", "   ", "\t", "3")
    println(v.filter(String::isNotBlank))
...