2016-12-15 10 views
5

Jestem nowy w firmie Kotlin i szukam porad w przepisywaniu tego kodu w bardziej elegancki sposób.Jak idiomatycznie przetestować niepuste, niepuste ciągi w Kotlin?

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

Jeśli używam następujący kod:

if (s?.isNotEmpty()) { 

Kompilator skarżą się, że

Required: Boolean 
Found: Boolean? 

Dzięki.

+1

mógłbyś edytować swój tytuł, aby lepiej odzwierciedlić swoje pytanie? Posiadanie wielu pytań o nazwie "Jak napisać ten kod w sposób Kotlina?" Tak naprawdę nie ułatwia późniejszego sprawdzenia. – marstran

+0

@marstran Tak, na pewno. Czy masz jakieś sugestie dotyczące tytułu? Nie mogę znaleźć dobrego sposobu na wyjaśnienie mojego problemu. Dzięki. – iForests

+0

Coś jak "Jak idiomatycznie sprawdzić dla nie-pustych, niepustych ciągów w Kotlin?" Może? Zasadniczo coś, co opisuje faktyczne pytanie. – marstran

Odpowiedz

11

Można użyć isNullOrEmpty lub jego znajomego isNullOrBlank tak:

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

Zarówno isNullOrEmpty i isNullOrBlank są metody przedłużania na CharSequence? więc można z nich korzystać bezpiecznie z null. Alternatywnie włączyć null na fałszywe tak:

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

Ok, dzięki. Chyba zadałem głupie pytanie. – iForests

+2

Dodam, że 'if (s! = Null && s.isNotEmpty()) {...}' _is_ idiomatic Kotlin dla tego scenariusza, jeśli chcesz kontynuować używanie 's' jako non-null przy użyciu inteligentnego rzutowania. – mfulton26

+3

Pytanie nie jest wcale głupie. Inną możliwą formą byłoby 'if (s? .isNotEmpty() == true) {}' –

2

Chociaż lubię odpowiedź przez @miensol bardzo, moja odpowiedź byłaby (i to dlaczego nie umieścić go w komentarzu): if (s != null && s.isNotEmpty()) { … } faktycznie jest idiomatyczny sposób w Kotlinie. Tylko w ten sposób otrzymasz inteligentną obsadę do String wewnątrz bloku, a ze sposobem w zaakceptowanej odpowiedzi będziesz musiał użyć s!! wewnątrz bloku.

+1

Sugestia @Kirill Rakhman również wygeneruje rzutowanie inteligentne: 'if (s? .isNotEmpty() == true) {}' – Love

+0

To prawda. To kwestia osobistych preferencji. Kiedy widzę podejrzaną część "== true", od razu myślę, że można ją usunąć, czego nie może w tym przypadku.Możesz zapisać 4 znaki, ale dla mnie jest mniej czytelny. –

0

lub utworzyć metodę rozszerzenia i używać go jako bezpiecznego połączenia:

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") 
} 
Powiązane problemy