[kotlin] 코 틀린 3 차 조건부 연산자

코 틀린에서이 표현과 동등한 것은 무엇입니까?

a ? b : c

Kotlin에서 유효한 코드가 아닙니다.



답변

코 틀린에서 if진술은 표현입니다. 따라서 다음 코드는 동일합니다.

if (a) b else c

표현과 진술의 구별은 여기서 중요합니다. Java / C # / JavaScript에서 if명령문을 구성하면 값으로 해석되지 않습니다. 보다 구체적으로는 변수에 변수를 할당 할 수 없습니다.

// Valid Kotlin, but invalid Java/C#/JavaScript
var v = if (a) b else c

if성명서가 있는 언어에서 온다면 이것은 부 자연스럽게 보일지 모르지만 그 느낌은 곧 사라질 것입니다.


답변

당신은 당신의 자신의 정의 할 수 있습니다 Boolean반환하는 확장 기능을 null(가) Boolean입니다이 false삼항 연산자와 유사한 구조를 제공하는 :

infix fun <T> Boolean.then(param: T): T? = if (this) param else null

이렇게하면 다음과 같이 a ? b : c표현식이로 변환됩니다 a then b ?: c.

println(condition then "yes" ?: "no")

업데이트 :
그러나 좀 더 Java와 같은 조건부 스위치를 수행하려면 다음과 같은 것이 필요합니다.

infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null

println(condition then { "yes" } ?: "no")
람다에주의하십시오. 콘텐츠 계산 conditiontrue

이것은 서투른 것처럼 보이 므로 Java 삼항 연산자를 Kotlin으로 포팅하는 데 필요한 요구가 높은 이유입니다.


답변

TL; DR

if (a) b else c

삼항 연산자 식 대신 사용할 수 있습니다 a ? b : c.


코 틀린, 많은 제어문을 포함 if, when또는 심지어 try로 사용할 수 있습니다 표현 . 이것은 변수에 할당되고 함수 등에서 반환되는 결과를 가질 수 있음을 의미합니다.

문법적으로 삼항 연산자가 필요하지 않습니다.

Kotlin의 표현의 결과로 언어 에는 실제로 삼항 연산자가 필요하지 않습니다 .

if (a) b else c

삼항 연산자 식 대신 사용할 수 있습니다 a ? b : c.

아이디어는 모든 사람들이 무엇을 알고 있기 때문에 이전 표현이 더 읽기 쉽다고 생각 ifelse하지만 ? :이미 구문에 익숙하지 않으면 다소 명확하지 않습니다.

그럼에도 불구하고 나는 종종 더 편리한 삼항 연산자를 그리워 한다는 것을 인정해야 합니다.


다른 대안들

언제

when조건을 확인할 때 Kotlin에서 사용 된 구문 을 볼 수도 있습니다 . 또 다른 방법으로 if-else 캐스케이드를 표현하는 방법이기도합니다. 다음은 OTs 예에 해당합니다.

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

확장

다른 답변에서 많은 좋은 예 ( Kotlin Ternary Conditional Operator )가 보여 주듯이 확장은 사용 사례 해결에 도움이 될 수 있습니다.


답변

나 자신을 위해 다음 확장 기능을 사용합니다.

fun T?.or<T>(default: T): T = if (this == null) default else this
fun T?.or<T>(compute: () -> T): T = if (this == null) compute() else this

첫 번째는 object가 null과 같은 경우 제공된 기본값을 반환합니다. 두 번째는 같은 경우에 람다로 제공된 표현을 평가합니다.

용법:

1) e?.getMessage().or("unknown")
2) obj?.lastMessage?.timestamp.or { Date() }

개인적으로 if건설 인라인 보다 더 읽기 쉬운 코드


답변

삼항 연산자와 동등한 Java

a ? b : c

한 줄로 Kotlin에서 간단한 IF

if(a) b else c

이 역할에서 보통의 경우 잘 작동하기 때문에 삼항 연산자가 없습니다 (조건? then : else).

https://kotlinlang.org/docs/reference/control-flow.html#if-expression


Null 비교를위한 특수 사례

Elvis 연산자를 사용할 수 있습니다

if ( a != null ) a else b
// equivalent to
a ?: b


답변

블록이 값을 반환하기 때문에 kotlin 에는 삼항 연산자없습니다.if else

그래서, 당신은 할 수 있습니다 :
val max = if (a > b) a else b
java 대신max = (a > b) ? b : c

우리는 또한 when건설 을 사용할 수 있으며 값을 반환합니다.

val max = when(a > b) {
    true -> a
    false -> b
}

kotlin 문서에 대한 링크는 다음과 같습니다. 제어 흐름 : if, when, for, while


답변

Kotlin에서는 if표현식입니다. 즉, 값을 반환합니다. 따라서 (condition ? then : else)평범한 경우이 역할에서 잘 작동하기 때문에 삼항 연산자가 없습니다 . 여기에서 수동 소스

// Traditional usage 
var max = a
if (a < b) max = b

// With else 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}

// As expression 
val max = if (a > b) a else b