2016-06-03 2 views
13

이런 식으로 작성할 수 있습니까? 아니면 Kotlin에서 수동 null 검사로 되돌려 야합니까?Kotlin에서 패턴 일치 옵션을 사용하는 방법은 무엇입니까?

val meaningOfLife : String? = null 

when meaningOfLife { 
    exists -> println(meaningOfLife) 
    else -> println("There's no meaning") 
} 
+0

'if' 구조는 이처럼 2 진 상황에 더 바람직합니다. 'when'와 정확히 같은 효과가 있습니다. – voddan

+0

효과가 동일하면 왜 더 선호할까요? '언제'의 장점은 성장할 여지가 있다는 것입니다. – TomTom

+0

null 가능성이있는 경우'when'는 성장하지 않습니다. 영광스러운'if'로'when'을 사용하는 것은 꽤 낭비입니다. IMO – voddan

답변

13

하나는 첫번째 null과 일치하는 것입니다 그래서 else 분기 String?은 암시 적으로 변환됩니다. String에 :

val meaningOfLife: String? = null 

when (meaningOfLife) { 
    null -> println("There's no meaning") 
    else -> println(meaningOfLife.toUpperCase()) //non-nullable here 
} 

이 컴파일러에 의해 수행 smart cast의 특별한 경우이다.

is Stringelse 가지 - is String -check 값이 null이 아닌 경우에도 마찬가지 효과를 얻을 수 있습니다.

null-safety에 관한 자세한 내용은 this answer을 참조하십시오.

println(meaningOfLife ?: "There's no meaning") 

질문의 예는 아마도 단순화 실제 상황, 그래서 널 체크하는 방법입니다

+1

첫 번째 경우''String ''을 만드는 것은 비슷한 효과를냅니다. – EPadronU

+1

@EPadronU, 완전하지 않음 : 바이트 코드 관점에서 볼 수 있듯이'is String'은'instanceof' 검사를 일으키고 응답의 코드는 'null'과 비교 만합니다. – hotkey

+0

감사합니다. 그것은 매우 유용합니다. 다행히도, 나는 "비슷한"이라고 말했다.) – EPadronU

11

당신은 다음과 같은 것을 수행 할 수 있습니다

val meaningOfLife: String? = null 

when (meaningOfLife) { 
    is String -> println(meaningOfLife) 
    else -> println("There's no meaning") 
} 
0

이 시도 : 가능한 방법의

val meaningOfLife : String? = null  
meaningOfLife?.let { println(it) } ?: println("There's no meaning") 

let in stdlib

+2

OP는 패턴 매칭을 사용하여이를 수행하는 방법을 알고 싶었습니다. 어쨌든, 당신의 표현은 다음과 같이 정리 될 수 있다고 생각합니다 :'println (meaningOfLife? : "의미가 없습니다")' – marstran

+1

IMO가 복잡합니다. 단순한'if'가 훨씬 더 읽기 쉽습니다. – voddan

1

참고로, 문제의 특정 상황은 디폴트 값의 ?: 연산자 간단한 솔루션을하는 방법이있다 나는 그것을 할 것이다.

if(meaningOfLife != null) 
    println(meaningOfLife) 
else 
    println("There's no meaning") 

이 BTW, 정확히 줄의 같은 번호를 사용합니다 : 이럴 if 당신은 바이너리 제어 흐름의 선택이있을 때 갈 수있는 더 좋은 방법입니다.

+0

나는 그 문제가 아마 그것에 관한 것이 아니라는 것을 이해한다. 그러나 나는 또한이 옵션이 언급되어야한다고 생각한다. – voddan