2016-12-15 4 views
5

저는 Kotlin에 익숙하지 않습니다. 다음 코드를 더 우아한 방법으로 다시 작성하라고 조언합니다.Kotlin에서 null이 아닌 비어 있지 않은 문자열을 관용적으로 테스트하는 방법은 무엇입니까?

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

나는 다음과 같은 코드를 사용하는 경우 :

if (s?.isNotEmpty()) { 

는 컴파일러는

Required: Boolean 
Found: Boolean? 

감사를 불평 할 것이다.

+1

편집 시겠어요 제목 더 나은 질문을 반영하기 위해? 'Kotlin 방식으로이 코드를 작성하는 방법'이라는 질문이 많아서 나중에 쉽게 찾아 볼 수 없습니다. – marstran

+0

@marstran 예. 제목에 대한 제안 사항이 있습니까? 내 문제를 설명하는 좋은 방법을 찾을 수 없습니다. 감사. – iForests

+0

'Kotlin에서 null이 아닌 비어 있지 않은 문자열을 관용적으로 테스트하는 방법'과 같은 것? 기본적으로 실제 질문을 설명하는 것입니다. – marstran

답변

11

당신과 같이 isNullOrEmpty 또는 친구 isNullOrBlank를 사용할 수 있습니다

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

모두 isNullOrEmptyisNullOrBlankCharSequence?에 확장 방법입니다 따라서 당신이 null 안전하게 사용할 수 있습니다. 또는 거짓과 같이로 null을 설정 : 나는 매우 @miensol하여 답을 좋아하지만

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

감사합니다. 나는 내가 어리석은 질문을했다고 생각한다. – iForests

+2

스마트 캐스팅을 사용하여 null이 아닌 's'를 실제로 사용하기를 계속하려면이 시나리오에 대해'if (s! = null && s.isNotEmpty()) {{}}'_is_ idiomatic Kotlin을 추가하십시오. – mfulton26

+3

질문은 어리석지 않습니다. 또 다른 가능한 형태는''(s? isNotEmpty() == true) {}' –

2

, 내 대답은 될 것이다 (그리고 내가 주석에 넣어하지 않는 이유입니다) : if (s != null && s.isNotEmpty()) { … } 실제로 입니다 코 틀린의 관용적 인 길. 이 방법으로 만 블럭 안의 String으로 똑똑한 캐스트를 얻는 반면, 받아 들인 대답의 길은 블럭 안에 s!!을 사용해야합니다.

+1

@Kirill Rakhman의 제안은 똑똑한 캐스트를 생성합니다.'if (s? .isNotEmpty() == true) {}' – Love

+0

맞습니다. 여기에 개인적인 취향의 문제가 있습니다. 의심스러운'== true '부분을 보았을 때 즉시 제거 될 수 있다고 생각했는데,이 경우 제거 할 수 없습니다.4 자까지 저장할 수 있지만 나에게는 읽기 쉽지 않습니다. –

0

또는 확장 메서드를 작성하고 안전한 통화로 사용 :

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") 
}