부울 사용? if 표현식에서


130

nullable이 있으면 Boolean bJava에서 다음 비교를 수행 할 수 있습니다.

Boolean b = ...;
if (b != null && b) {
   /* Do something */
} else {
   /* Do something else */
}

Kotlin에서는 !!연산자 를 사용하여 동일한 결과를 얻을 수 있습니다 .

val b: Boolean? = ...
if (b != null && b!!) {
   /* Do something */
} else {
   /* Do something else */
}

그러나 사용은 !!널 안전 시스템을 우회하여 나에게 약간 스케치 느낌이 듭니다.

이에 대한 더 우아한 접근 방식이 있습니까?


편집 조금 과장된 것 같습니다. 지역 변수의 경우 Banthar가 보여 주듯이 작동합니다. 그러나 내 부울 b은 실제로 "백킹 필드가있는 속성"입니다 (나는 아직 속도에 익숙하지 않습니다). 결과는 다음과 같습니다.

여기에 이미지 설명 입력


!!b단순히 필요한 것이 아니라 왜 필요한가 b? (저는 kotlin에 익숙하지 않습니다. 단지 골동품
일뿐입니다.

1
@MarounMaroun 이후가 b될 수 null와 코 틀린의 특징 중 하나는 널 안전 널 (NULL) 참조를 평가하려고 할 때 컴파일 오류를 제공합니다. 따라서 plain을 b사용하면 컴파일 오류가 발생합니다. :)
nhaarman

그러나 b != nil오른쪽을 확인하기 전에 그것을 잡을 수 없습니까?
Maroun 2015 년

당신은 실제로 말할 것이지만 내 IDE는 그렇지 않다고 말합니다. 나는 그런 것이 작동해야한다는 것을 기억한다. 내가 무언가를 찾을 수 있는지 볼 것이다.
nhaarman 2015 년

val r = b?doSomething() ?: doSomethingElse()작동해야 한다고 생각 합니다.
Maroun 2015 년

답변:


183

당신은 널 (NULL)와 부울 비교할 수 있습니다 true, false또는 null평등 연산자를 사용하여 :

var b: Boolean? = null
if (b == true) {
    // b was not null and equal true
} 
if (b == false) {
   // b is false 
}
if (b != true) { 
   // b is null or false 
}

4
참고 : 역 연산자 작동하지 않는 것!
리처드

7
@Richard는 b를 true, false또는 null. 그런 일을 할 때 if (b != true)당신은 단지 그 B를 알고있는 것은 사실이 아니다,하지만 당신에 대해 아무것도 모르는 falsenull
jivimberg

7
eg2. if (b != true) // b is null or falseeg3. if (b == false) // b is false
hmac

이것은 정답이며 Kotlin에서 의미가 있지만 Java 배경에서 왔기 때문에 if 문 내에서 true 또는 false 또는 null을 명시 적으로 비교하는 것이 이상하게 느껴질 수 있습니다. 이것이 왜 그렇게 인기있는 질문과 답변인지 설명 할 수 있습니다.
마이클 피터슨

31

당신이 명확하게 확인하려는 경우가 있는지 여부 Boolean?입니다 true또는false 당신은 할 수 있습니다 :

when(b) {
    true -> {}
    false -> {}
}

그것이 맞는지 확인하고 싶다면 null그 (또는 else)를 다음 값으로 추가 할 수 있습니다 when.

when(b) {
    true -> {}
    false -> {}
    null -> {}
}

when(b) {
    true -> {}
    false -> {}
    else-> {}
}

22

Kotlin은 null 검사를 정적으로 분석합니다. 이건 괜찮아:

val b: Boolean? = null
if (b != null && b) {
    println(b)
}

이것이 유형 오류로 실패하더라도 :

val b: Boolean? = null
if (b == null && b) {
    println(b)
}

자세한 내용은 http://kotlinlang.org/docs/reference/null-safety.html을 참조하십시오.

"null 통합 연산자"(변경 가능한 변수에 대해 작동 함)를 사용할 수도 있습니다.

val b: Boolean? = null
if (b ?: false) {
    println(b)
}

분석은 불변 값에 대해서만 작동합니다. 변경 가능한 필드에이를 수행해야하는 경우 임시 로컬 변수에 저장하십시오.
Piotr Praszmo 2015 년

1
정말 말이됩니다. 널 병합 연산자는 아마도 내가 찾던 것입니다. 감사!
nhaarman

@Banthar는 완전히 정확하지 않습니다 (두 번째 예제는 var?) ... 로컬 인 var경우 컴파일러는 여전히 안전한 캐스트를 허용 할 수 있습니다. 더 특별한 경우를 보려면 stackoverflow.com/questions/34498562/…를
Jayson Minard

null 합체 엘비스는 과제로 이동할 수 있습니다val booleanVal = nullableProducer?.produceVal() ?: false; if (booleanVal) {}
Serge

6

내가 본 부울에서? nullable 개체에 대해 Boolean을 반환하는 메서드의 결과입니다.

val person: Person? = null
....
if(person?.isHome()) { //This won't compile because the result is Boolean?
  //Do something
}

내가 사용한 해결책은 let함수를 사용 하여 가능한 반환 된 null 값을 제거하는 것입니다.

person?.let {
  if(it.isHome()) {
    //Do something
  }
}

5
첫 번째는 if블록을 person?.isHome() == true.
Hesam

2

Kotlin에서 다음과 같이 할 수 있습니다.

val b: Boolean? = true
if (b == true) { // if b is null, this should be null == true
    /* Do something */
} else {
    /* Do something else */
}

3
b != null && b == true와 동일합니다 b == true.
nhaarman

1

먼저 아래에 사용자 정의 인라인 함수를 추가하십시오.

inline fun Boolean?.ifTrue(block: Boolean.() -> Unit): Boolean? {
    if (this == true) {
        block()
    }
    return this
}

inline fun Boolean?.ifFalse(block: Boolean?.() -> Unit): Boolean? {
    if (null == this || !this) {
        block()
    }

    return this
}

그런 다음 다음과 같은 코드를 작성할 수 있습니다.

val b: Boolean? = ...
b.ifTrue {
   /* Do something in true case */
}

//or

b.ifFalse {
   /* Do something else in false case */
}

예, 다음과 같은 경우 : b.ifTrue {...} 또는 b.ifFalse {...} 유용 할 수 있습니다
zyc zyc

1

Kotlin의 경우 일반적으로 사용하는 것은

if (object?.booleanProperty ==true)
   { 
     //do stuff 
   }

이것은 속성이 true이고 객체가 null이 아닌 경우에만 작동합니다. 반대의 경우 :

if (!object?booleanProperty !=true)
   { 
     //do Stuff
   }

0

다음 if-else과 함께 문을 사용합시다 Elvis Operator.

val a: Boolean?
val b: Boolean?

a = true
b = null

if (a != null ?: b) { 
    println("One of them isn't nullable...")
} else {
    println("Both are nullables!")
}

// 결과 : "그 중 하나는 nullable이 아닙니다 ..."

a = null
b = null

if (a != null ?: b) { 
    println("One of them isn't nullable...")
} else {
    println("Both are nullables!")
}

// 결과 : "둘 다 nullable입니다!"


0

도움이된다면 확장 기능을 추가하는 것은 매우 쉽습니다.

fun Boolean?.orDefault(default: Boolean = false): Boolean {
    if (this == null)
        return default
    return this
}

var x: Boolean? = null

if(x.orDefault()) {
..
}

0

경우는 모두 작업을 수행하려는 경우 containA의 String아래처럼 평등 검사를 사용할 수 있습니다 -

if (url?.contains("xxx") == true){
  return false;
}

-1

안전한 운영자 "let"으로 할 수 있습니다.

val b: Boolean? = null
b?.let { flag ->
    if(flag){
        // true Block
    } else {
        // false Block
    }
}

이것은 사실이 아니며 예외가 발생하면 반환됩니다.
nhaarman 2011

이전 댓글을 기반으로 내 답변을 편집했습니다
finalpets
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.