.find () не выполняет свой блок в пустом списке в kotlin - PullRequest
0 голосов
/ 22 декабря 2018

поэтому сегодня я наткнулся на интересную ошибку и хотел спросить причину почему.У меня есть следующее:

val phone = contactDAO.phones?.find {
    val phone = it.content
    phone != null && !phone.startsWith("+")
} != null
if (phone) {...}

так что да, телефоны могут быть нулевыми, но они также могут быть пустыми.Кажется, что kotlin видит, что это не null, и переходит к .find, но понимает, что он пуст и поэтому никогда не выполняет блок внутри.почему это?и есть ли более чистый способ сделать эту проверку вместе с .find?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Это уже достаточно просто, вам не нужно проверять null в предикате.

Пример

val phones: List<String>? = listOf("1", "2", "+3", "4", "5")
println(phones?.find { it.startsWith("+") })

Выход

+3

Пример

val phones: List<String>? = null
println(phones?.find { it.startsWith("+") })

Выход

null

Также просто на голову, find будет соответствовать только первому элементу или null, если ни один не найден, возможно, вас больше всего интересует filter, который возвращает List со всеми соответствующими элементами

0 голосов
/ 22 декабря 2018

Вот простой пример.

@JvmStatic
fun main(arr: Array<String>) {
    val array = emptyArray<String>()
    val foundItem = array.find {
        it == "String" // This will never call
    }
    println(foundItem)
}

Если ваш массив пуст, условие предиката find никогда не будет вызываться.Это не причина звонить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...