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


98

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

val list = mutableList ?: mutableListOf() 

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

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

5
null이 아니면 왼쪽을 반환하고 그렇지 않으면 오른쪽을 반환합니다. 첫 번째 표현식은 두 번째 표현식에 대한 짧은 표기법입니다. kotlinlang.org/docs/reference/null-safety.html#elvis-operator
Eugen Pechanec

답변:


115

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


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

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

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

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

예 :

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

3
이것은 정말 멋지다. 나는 elvis operator더 이상 다른 것으로 축소 될 수 있다고 생각하지 않았습니다 . 좋은! 그리고 좋은 설명, 감사합니다!
sud007

88

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

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 출판


84
미스터 프레슬리 설명을위한 플러스 1
s1m0nw1

7
? :) (엘비스 미소로 참조)
LeoColman

1
잠시 후 엘비스 오퍼레이터라고 불리는 이유를 이해할 수 없습니다. 당신의 일러스트레이션은 왜 엘비스 오퍼레이터라고 불리는 지 알게되었습니다. :)
Yohanes AI

엘비스에 대한 이야기가 사실인가요? 하하
Hillcow

@Kerooker 그는 웃고 있지 않다? : | 더 나은 IMO가 될 것입니다.
ahmed galal

38

이것은 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

10
당신이 자바에서 온 경우, 그것은 더 속기입니다 :a != null ? a : b
crgarridos

9

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

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

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


3

간단히 우리는 두 손을 가지고 있다고 말할 수 있습니다. 당신은 알고 싶어요, 당신의 왼손이 지금 작동하고 있습니까?. 왼손이 작동하지 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"

이 대답을 사랑하십시오. 이해하기에는 너무 깨끗합니다.
Gk Mohammad Emon

2

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

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

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


1

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

x = a ?: b

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

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

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

1

약간의 추가는 이것입니다

X = A ?: B

X여전히 것 null두 경우 A와는 B로 평가null

따라서 X항상 non-null이고 싶다면 B항상 a non-null또는 함수 또는 표현식인지 B항상 평가 하는지 확인하십시오 non-null.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.