?:
예를 들어이 경우에서 무엇을하는지 알 수 없습니다.
val list = mutableList ?: mutableListOf()
왜 이것을 수정할 수 있습니까?
val list = if (mutableList != null) mutableList else mutableListOf()
?:
예를 들어이 경우에서 무엇을하는지 알 수 없습니다.
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.
elvis operator
더 이상 다른 것으로 축소 될 수 있다고 생각하지 않았습니다 . 좋은! 그리고 좋은 설명, 감사합니다!
엘비스 운영자는 다음에 콜론 물음표로 표시됩니다 : ?:
그것은이 구문을 사용할 수 있습니다 :
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"
}
이 경우 계산 된 값이 getPotentialNull
null이 아니면 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 에서 유래했습니다 . 그의 헤어 스타일은 물음표와 비슷합니다.
출처 : 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
a != null ? a : b
의를 살펴 보자 (고화질)를 :
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"
Kotlin의 elvis 연산자는 null 안전에 사용됩니다.
x = a ?: b
상기 코드에서 x
의 값이 할당 될 a
A가없는 경우를 null
하고 b
있는 경우가 a
있다 null
.
elvis 연산자를 사용하지 않는 동등한 kotlin 코드는 다음과 같습니다.
x = if(a == null) b else a