Условный оператор Котлина

Что эквивалентно этому выражению в Котлине?

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 является false чтобы создать структуру, похожую на тернарный оператор:

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

Это сделает a ? b : c a ? b : c выражение 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") обратите внимание на лямбда. его расчет содержания должен быть отложен до тех пор, пока мы не убедимся в том, что condition true

Этот выглядит неуклюжим, поэтому существует высокий спрос на порт Java-оператора Тройны в Котлин

Для себя я использую следующие функции расширения:

 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 

Первый возвращает значение по умолчанию, если объект равен нулю. Второй будет оценивать выражение, представленное в лямбда в том же случае.

Применение:

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

Лично для меня код выше более читабельного, чем if строительство

В 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 

Взгляните на документы :

В Kotlin, if является выражением, т.е. оно возвращает значение. Поэтому нет тройного оператора (условие? Then: else), потому что обычный, если работает отлично в этой роли.

В kotlin нет тернарного оператора , поскольку блок if else возвращает значение

так что вы можете сделать: val max = if (a > b) a else b вместо java max = (a > b) ? b : c max = (a > b) ? b : c

Мы также можем использовать when построении, это также возвращает значение:

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

здесь ссылка для документации https://kotlinlang.org/docs/reference/control-flow.html

Некоторые угловые случаи, не упомянутые в других ответах.

С появлением takeIf в Kotlin 1.1 тернарный оператор a ? b : c a ? b : c также может быть выражено следующим образом:

 b.takeIf { a } ?: c 

Это становится еще короче, если c имеет значение null :

 b.takeIf { a } 

Также обратите внимание, что типичный в Java мире null проверяет как value != null ? value : defaultValue value != null ? value : defaultValue переводить в идеоматическом Kotlin просто value ?: defaultValue .

Аналогично a != null ? b : c a != null ? b : c можно перевести на a?.let { b } ?: c .

Ява

 int temp = a ? b : c; 

Эквивалентен Котлину:

 var temp = if (a) b else c 

при замене оператора switch C-подобных языков. В простейшей форме это выглядит так:

 when (x) { 1 -> print("x == 1") 2 -> print("x == 2") else -> { print("x is neither 1 nor 2") } } 

В Котлине нет тройного оператора. Это кажется проблематичным с первого взгляда. Но подумайте, что мы можем сделать это с помощью inline if else, потому что это выражение здесь. Просто мы должны сделать –

 var number = if(n>0) "Positive" else "Negetive" 

Здесь мы можем еще, если блок слишком много, сколько нам нужно. Подобно-

 var number = if(n>0) "Positive" else if(n<0) "Negative" else "Zero" 

Так что эта строка настолько проста и удобочитаема, как тернарный оператор. когда мы используем более одного тернарного оператора в java, это кажется ужасным. Но здесь мы имеем четкий синтаксис. даже мы можем написать его также в нескольких строках.

Другим интересным подходом было бы использовать, when :

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

Может быть весьма удобно в некоторых более сложных сценариях. И, честно говоря, это более читаемо для меня, чем if ... else ...

как цитирует Дрю Ноукс, kotlin использует выражение if как выражение, поэтому Тернарный Условный Оператор больше не нужен,

но с функцией расширения и перегрузкой infix вы можете реализовать это самостоятельно, вот пример

 infix fun <T> Boolean.then(value: T?) = TernaryExpression(this, value) class TernaryExpression<out T>(val flag: Boolean, val truly: T?) { infix fun <T> or(falsy: T?) = if (flag) truly else falsy } 

затем используйте его так

 val grade = 90 val clazz = (grade > 80) then "A" or "B" 

Вы можете сделать это много в Котлине

  1. Использование if

     if(a) b else c 
  2. Использование, когда

     when (a) { true -> print("value b") false -> print("value c") else -> { print("default return in any other case") } } 
  3. Нулевая безопасность

     val a = b ?: c 

Выражения -> Выражения

В Kotlin многие управляющие выражения, включая if , when или even try могут использоваться в качестве выражений . Это означает, что он имеет результат и может быть назначен переменной, возвращенной из функции и т. Д.

Нет необходимости в тройном операторе

Сказав это, Котлин не нужен тернарный оператор .

if (a) b else c – это то, что вы можете использовать вместо выражения Java a ? b : c a ? b : c .

ИМО , последний менее читабель, так как все знают, что делает, если ? : ? : довольно неудобно. Поэтому я согласен, что тернарный оператор не имеет права существовать в Котлине.

Другие альтернативы

когда

Вы также можете увидеть многое, when создаете, когда условия проверяются в Котлине. Это также способ выражения if-else каскадов альтернативным способом. Следующее соответствует вашему примеру.

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

расширения

Как показывает множество хороших примеров ( https://stackoverflow.com/a/39687177/8073652 ), в других ответах также могут быть расширения.

Вы можете использовать выражение для этого в Котлине. В Kotlin if – выражение с результатом результата. Итак, в Котлине мы можем написать

 fun max(a: Int, b: Int) = if (a > b) a else b 

и в Java мы можем добиться того же, но с большим кодом

 int max(int a, int b) { return a > b ? a : b } 

Еще один короткий подход к использованию

 val value : String = "Kotlin" value ?: "" 

Здесь kotlin сам проверяет нулевое значение, и если он равен нулю, он передает пустое строковое значение.

В Котлине нет тройного оператора .

В Kotlin, if является выражением, т.е. оно возвращает значение.

Поэтому нет тройного оператора (условие? Then: else), потому что обычный, если работает отлично в этой роли.

Эквивалент в Котлине

 var a = if (a) b else c 

Справочный документ : https://kotlinlang.org/docs/reference/control-flow.html

Со следующими функциями infix я могу охватить многие распространенные случаи использования почти так же, как это можно сделать в Python:

 class TestKotlinTernaryConditionalOperator { @Test fun testAndOrInfixFunctions() { Assertions.assertThat(true and "yes" or "no").isEqualTo("yes") Assertions.assertThat(false and "yes" or "no").isEqualTo("no") Assertions.assertThat("A" and "yes" or "no").isEqualTo("yes") Assertions.assertThat("" and "yes" or "no").isEqualTo("no") Assertions.assertThat(1 and "yes" or "no").isEqualTo("yes") Assertions.assertThat(0 and "yes" or "no").isEqualTo("no") Assertions.assertThat(Date() and "yes" or "no").isEqualTo("yes") @Suppress("CAST_NEVER_SUCCEEDS") Assertions.assertThat(null as Date? and "yes" or "no").isEqualTo("no") } } infix fun <E> Boolean?.and(other: E?): E? = if (this == true) other else null infix fun <E> CharSequence?.and(other: E?): E? = if (!(this ?: "").isEmpty()) other else null infix fun <E> Number?.and(other: E?): E? = if (this?.toInt() ?: 0 != 0) other else null infix fun <E> Any?.and(other: E?): E? = if (this != null) other else null infix fun <E> E?.or(other: E?): E? = this ?: other 
  • Модернизация с помощью качеств Котлина, которые включают реализованные методы
  • Зависимость между Maven и Kotlin не приводит к классам Котлина
  • Могу ли я запустить kotlin как скрипт с Java Scripting API
  • Можно ли использовать Котлин в Граале?
  • Как создать экземпляр анонимного интерфейса в Котлине?
  • Обработка аннотаций с помощью kotlin-maven-plugin
  • Разбор json со сломанным удаленным API
  • Наблюдение за повторным использованием выполнения оператора
  • Ошибка выполнения сервлета Apache Tomcat, написанного в Котлине
  • (Java + Kotlin) Autowiring: ожидается не менее 1 бит, который квалифицируется как кандидат на автоподключение для этой зависимости
  • Подсчет количества экземпляров классов в режиме отладки
  • Давайте будем гением компьютера.