web-dev-qa-db-fra.com

Comment tester idiomatiquement des chaînes non nulles et non vides dans Kotlin?

Je suis nouveau chez Kotlin, et je cherche des conseils pour réécrire le code suivant de manière plus élégante.

var s: String? = "abc"
if (s != null && s.isNotEmpty()) {
    // Do something
}

Si j'utilise le code suivant:

if (s?.isNotEmpty()) {

Le compilateur se plaint que

Required: Boolean
Found: Boolean?

Merci.

13
iForests

Vous pouvez utiliser isNullOrEmpty ou son ami isNullOrBlank like so:

if(!s.isNullOrEmpty()){
    // s is not empty
}

isNullOrEmpty et isNullOrBlank sont des méthodes d'extension sur CharSequence?. Vous pouvez donc les utiliser en toute sécurité avec null. Sinon, transformez null en false comme ceci:

if(s?.isNotEmpty() ?: false){
    // s is not empty
}

vous pouvez aussi faire ce qui suit 

if(s?.isNotEmpty() == true){ 
    // s is not empty
}
19
miensol

Bien que j'aime beaucoup la réponse de @miensol, ma réponse serait (et c'est pourquoi je ne la mets pas dans un commentaire): if (s != null && s.isNotEmpty()) { … } en fait est la manière idiomatique de Kotlin. Ce n'est que de cette manière que vous obtiendrez une distribution intelligente dans String à l'intérieur du bloc, tandis qu'avec la réponse acceptée, vous devrez utiliser s!! à l'intérieur du bloc.

3
Michael Piefel

ou créez une méthode d'extension et utilisez-la comme appel sécurisé: 

fun String?.emptyToNull(): String? {
    return if (this == null || this.isEmpty()) null else this
}

fun main(args: Array<String>) {
    val str1:String?=""
    val str2:String?=null
    val str3:String?="not empty & not null"

    println(str1.emptyToNull()?:"empty string")
    println(str2.emptyToNull()?:"null string")
    println(str3.emptyToNull()?:"will not print")
}
0
mt.uulu