[kotlin] 무엇입니까? : Kotlin에서 수행합니까? (엘비스 오퍼레이터)

?:예를 들어이 경우에서 무엇을하는지 알 수 없습니다.

val list = mutableList ?: mutableListOf()

왜 이것을 수정할 수 있습니까?

val list = if (mutableList != null) mutableList else mutableListOf()



답변

TL; DR : 결과 개체 참조 [첫 번째 피연산자]가 아닌 null경우 반환됩니다. 그렇지 않으면 두 번째 피연산자의 값 (일 수 있음 null)이 반환됩니다.


엘비스 운영자는 많은 프로그래밍 언어, 예를 들어 코 틀린뿐만 아니라 그루비 또는 C #의 일부입니다. 나는 찾을 위키 백과의 정의는 매우 정확한 :

특정 컴퓨터 프로그래밍 언어에서 Elvis 연산자 ?: 는 피연산자가 인 경우 첫 번째 피연산자를 반환 하고 그렇지 않으면 두 번째 피연산자를 평가하여 반환 하는 이항 연산자 입니다 true. 이는 해당 언어 (및 기타 여러 언어)에서 발견 되는 삼항 조건 연산자 , 의 변형입니다? : . Elvis 연산자는 두 번째 피연산자가 생략 된 삼항 연산자입니다 .

특히 Kotlin의 경우 다음 사항이 적용됩니다.

일부 컴퓨터 프로그래밍 언어는이 연산자에 대해 다른 의미를 가지고 있습니다. 첫 번째 피연산자가 부울을 생성해야하는 대신 객체 참조가 생성되어야합니다 . 결과 객체 참조가가 아닌 null경우 반환됩니다. 그렇지 않으면 두 번째 피연산자의 값 (일 수 있음 null)이 반환됩니다.

예 :

x ?: y // yields `x` if `x` is not null, `y` otherwise.


답변

엘비스 운영자는 다음에 콜론 물음표로 표시됩니다 : ?:그것은이 구문을 사용할 수 있습니다 :

first operand ?: second operand

간결한 코드를 작성할 수 있으며 다음과 같이 작동합니다.

경우 first operand null가 아닌 , 다음이 반환됩니다. 이 경우 null 인 경우 , 다음이 second operand반환됩니다. 제공된 값이 null 인 경우 nullable이 아닌 값을 제공하므로식이 null 값을 반환하지 않도록 보장하는 데 사용할 수 있습니다.


예 (Kotlin에서) :

fun retrieveString(): String {    //Notice that this type isn't nullable
    val nullableVariable: String? = getPotentialNull() //This variable may be null

    return nullableVariable ?: "Secondary Not-Null String"
}

이 경우 계산 된 값이 getPotentialNullnull이 아니면 retrieveString; 널이면 두 번째 표현식 "Secondary Not-Null String"이 대신 리턴됩니다.

또한 오른쪽 표현식은 왼쪽이 null 인 경우 에만 평가 됩니다 .

코 틀린, 당신은 같은 표현을 사용할 수 second operand등으로, throw Exception표현

return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")

Elvis Operator라는 이름은 유명한 미국 가수 Elvis Presley 에서 유래했습니다 . 그의 헤어 스타일은 물음표와 비슷합니다.

엘비스 QuestionMark

출처 : Wojda, I. Moskala, M. Android Development with Kotlin. 2017. Packt 출판


답변

이것은 Elvis 연산자 라고 불리며 그것은 … 정확히 당신이 질문에서 설명한 것과 같습니다. 왼쪽이 null값이면 대신 오른쪽을 반환합니다. 그렇지 않으면 왼쪽에있는 값을 반환합니다.

a ?: b의 약어입니다 if (a != null) a else b.

유형이있는 더 많은 예 :

val x: String? = "foo"
val y: String = x ?: "bar"      // "foo", because x was non-null    

val a: String? = null
val b: String = a ?: "bar"      // "bar", because a was null


답변

의를 살펴 보자 (고화질)를 :

nullable 참조 r이있을 때 “r이 null이 아니면 사용하고, 그렇지 않으면 null이 아닌 값 x를 사용”이라고 말할 수 있습니다.

?:(엘비스) 연산자는 상세를 방지하고 정말 간결한 코드를 만든다.

예를 들어, 많은 컬렉션 확장 함수 null가 폴백으로 반환 됩니다.

listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")

?:여러 계층의 폴 백이있는 경우에도 폴백 케이스를 효율적으로 처리 할 수있는 방법을 제공합니다. 그렇다면 다음과 같이 Elvis 연산자를 곱하기 만하면됩니다.

val l = listOf(1, 2, 3)

val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")

만약 그렇지 않다면 똑같이 표현한다면 더 읽기 어려운 코드가 될 것입니다.


답변

간단히 우리는 두 손을 가지고 있다고 말할 수 있습니다. 당신은 알고 싶어요, 당신의 왼손이 지금 작동하고 있습니까?. 왼손이 작동하지 return empty않으면busy

Java의 예 :

private int a;
if(a != null){
    println("a is not null, Value is: "+a)
}
else{
    println("a is null")
}

Kotlin의 예 :

val a : Int = 5
val l : Int = if (a != null) a.length else "a is null"


답변

기본적으로 Elvis의 왼쪽이 어떤 이유로 null을 반환하면 대신 오른쪽이 반환됩니다.

val number: Int? = null
println(number ?: "Number is null")

따라서 number가 NOT null이면 숫자 를 인쇄하고 그렇지 않으면 “Number is null”을 인쇄합니다.


답변

Kotlin의 elvis 연산자는 null 안전에 사용됩니다.

x = a ?: b

상기 코드에서 x의 값이 할당 될 aA가없는 경우를 null하고 b있는 경우가 a있다 null.

elvis 연산자를 사용하지 않는 동등한 kotlin 코드는 다음과 같습니다.

x = if(a == null) b else a