Как я могу улучшить это с помощью Kotlin IsNullOrEmpty()

#android #kotlin

#Android #kotlin

Вопрос:

 fun updatePath(query: String?){
        this.query = query
    
    }

    fun build(): String {

        if (!query.isNullOrEmpty()) {
            val encodedQuery = encode(query)   
        }
  
    }
  

encode() принимает только ненулевую строковую переменную.
но здесь он все еще жалуется на запрос, который я передаю?
Я ожидал, что использование isNullOrEmpty() должно решить эту проблему.

Ответ №1:

Вы можете использовать функцию kotlin Scope с нулевой безопасностью, чтобы избежать таких предупреждений.

Вот так —

 fun build(): String {
    query?.let {
        if (it.isNotEmpty()) {
            val encodedQuery = encode(query)
        }
    }
}
  

РЕДАКТИРОВАТЬ: Спасибо @Tenfour04 за уведомление об этом, мы должны использовать экземпляр внутри блока.

 fun build(): String {
    query?.let { it ->
        if (it.isNotEmpty()) {
            val encodedQuery = encode(**it**)
        }
    }
}
  

Комментарии:

1. Это все равно не сработает, потому что query имеет значение null. Вам понадобится encode(it) .

2. Спасибо @Tenfour04, я полностью пропустил это. Не использовал объект контекста внутри.

Ответ №2:

Я бы использовал smartcast или, возможно takeIf , чтобы избежать вложенности.

 query?.takeIf { it.isNotEmpty() }?.let {
    encode(it)
}
  

Ответ №3:

Если encode принимает любую ненулевую строку (включая пустую строку), то вы могли бы сделать следующее.

 fun build(): String {
  ...
  val encodedQuery = query?.let(::encode)
  ...
}
  

Ответ №4:

Компилятор не может выполнять smartcast, поскольку ваш запрос является var , поэтому он может измениться. Вы могли бы сделать следующее: val query = query Перед if

Это затеняет запрос имени. Вы все еще можете использовать свойство запроса через this.query