Что является эквивалентом этого выражения в Kotlin?
a ? b : c
Это неверный код в Котлине.
kotlin
conditional-operator
Дрю Ноакс
источник
источник
Ответы:
В Kotlin
if
заявления являются выражениями. Таким образом, следующий код эквивалентен:Здесь важно различие между выражением и утверждением. В Java / C # / JavaScript
if
формирует утверждение, означающее, что оно не преобразуется в значение. Конкретнее, вы не можете присвоить его переменной.Если вы говорите на языке, на котором
if
есть утверждение, это может показаться неестественным, но это чувство скоро должно исчезнуть.источник
when
.x = a==b
b + if (a) c else d
vs.b + (c if (a) else d)
Последний требует дополнительных скобок. потому чтоc
не включено в условие иelse
.Вы можете определить свою собственную
Boolean
функцию расширения , которая возвращается ,null
когдаBoolean
являетсяfalse
обеспечить структуру , подобную троичной оператора:Это сделало бы
a ? b : c
выражение переводящимa then b ?: c
, вот так:Обновление: Но чтобы сделать еще один Java-подобный условный переход, вам понадобится что-то подобное
infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null
println(condition then { "yes" } ?: "no")
обратите внимание на лямбду. расчет его содержание должно быть отложено , пока мы не уверены ,condition
являетсяtrue
Это выглядит неуклюже, поэтому существует высокий спрос на портирование троичного оператора Java в Котлин
источник
infix inline fun<T> Boolean.then(param: ()->T):T? = if(this) param() else null
true then { null } ?: "not-null"
?:
оператор здесьelvis-operator
: kotlinlang.org/docs/reference/null-safety.html#elvis-operatorTL; DR
это то, что вы можете использовать вместо выражения троичного оператора
a ? b : c
.В Котлин, многие управляющие операторы в том числе
if
,when
или дажеtry
могут быть использованы в качестве выражения . Это означает, что у них может быть результат, который можно присвоить переменной, вернуть из функции и т. Д.Синтаксически, нет необходимости в троичном операторе
В результате выражений Котлина языку на самом деле не нужен троичный оператор .
это то, что вы можете использовать вместо выражения троичного оператора
a ? b : c
.Я думаю, что идея в том, что первое выражение более читабельно, так как все знают, что
ifelse
делает, тогда? :
как довольно непонятно, если вы уже не знакомы с синтаксисом.Тем не менее, я должен признать, что мне часто не хватает более удобного троичного оператора.
Другие альтернативы
когда
Вы также можете увидеть
when
конструкции, используемые в Kotlin при проверке условий. Это также способ выразить каскад if-else альтернативным способом. Следующее соответствует примеру OTs.расширения
Как показывают многие хорошие примеры ( Kotlin Ternary Conditional Operator ) в других ответах, расширения также могут помочь в решении вашего варианта использования.
источник
Для себя я использую следующие функции расширения:
Первый возвращает возвращаемое значение по умолчанию, если объект равен нулю. Второй будет оценивать выражение, предоставленное в лямбда в том же случае.
Применение:
Лично для меня код выше более
if
читабелен, чем встроенная конструкцияисточник
e.getMessage() ?: "unknown"
. Второе можно выразить какobj?.lastMessage?.timestamp ?: { Date() }()
Java-эквивалент троичного оператора
простой IF в Котлине в одну строку
https://kotlinlang.org/docs/reference/control-flow.html#if-expression
Особый случай для нулевого сравнения
Вы можете использовать оператор Элвиса
источник
В котлине нет троичного оператора , так как
if else
блок возвращает значениеИтак, вы можете сделать:
val max = if (a > b) a else b
вместо Javamax = (a > b) ? b : c
Мы также можем использовать
when
конструкцию, она также возвращает значение:Вот ссылка на документацию kotlin: Поток управления: если, когда, для, пока
источник
источник
Некоторые угловые случаи, не упомянутые в других ответах.
С момента появления takeIf в Kotlin 1.1 троичный оператор
a ? b : c
также может быть выражен так:Это становится еще короче, если с
null
:Также обратите внимание, что типичные в мире Java проверки
value != null ? value : defaultValue
на ноль, такие как перевод в идеологическом Kotlin, простоvalue ?: defaultValue
.Подобное
a != null ? b : c
можно перевести наa?.let { b } ?: c
.источник
b.takeIf { a } ?: c
короче и читабельнее, чемif (a) b else c
? Тернерный оператор, безусловно, отсутствует в Kotlin, так как имена переменных и условия могут быть длинными, и вы можете разбить строку, что плохоtakeIf
всегда оценивает истинный случай (здесьa
). Мало того, что это выражение может быть вычислено бесполезно, если оноa
окажется ложным, но вы не сможете извлечь выгоду из умных приведений а-ляif (a is Int) { a + 3 }
.{ a }
это лениво оцененная лямбда.b
)". Но даже{ a }
, будучи ленивым, нужно оценить, чтобы определить результат выражения.Посмотрите на документы :
источник
Ява
Эквивалент Котлину:
источник
ЗАДАЧА :
Давайте рассмотрим следующий пример:
Нам нужен следующий эквивалент в Kotlin:
РЕШЕНИЯ :
1.а . Вы можете использовать
if-expression
в Kotlin:1б . Может быть намного лучше, если вы перевернете это
if-expression
(давайте сделаем это безnot
):2 . Оператор Котлина Элвис
?:
может сделать работу еще лучше:3 . Или используйте
Extension function
для соответствующегоAnswer
класса:4 . Используя
Extension function
вы можете уменьшить код благодаряElvis operator
:5 . Или просто используйте
when
оператор:Надеюсь это поможет.
источник
когда заменяет оператор переключения C-подобных языков. В простейшем виде это выглядит так
источник
when
форму выражения, а не выражения. Более уместным сравнением с троичными условными выражениями было бы, чтобы каждая ветвь возвращала значение, такое, чтобы целое выражение выражало значение (как это происходит с троичными условными выражениями).В Котлине нет троичного оператора. Это кажется проблематичным на первый взгляд. Но думаю, что мы можем сделать это с помощью встроенного оператора if else, потому что это выражение здесь. Просто мы должны сделать -
Здесь мы можем еще, если заблокировать слишком много, сколько нам нужно. Подобно-
Так что эта строка настолько проста и намного удобочитаемее, чем троичный оператор. когда мы используем более одного троичного оператора в Java, это кажется ужасным. Но здесь у нас есть четкий синтаксис. даже мы можем написать это в несколько строк тоже.
источник
Вы можете использовать
var a= if (a) b else c
вместо троичного оператора.Другая хорошая концепция kotlin - оператор Элвиса. Вам не нужно проверять ноль каждый раз.
Это вернет длину, если b не равно нулю, иначе он выполнит оператор правой части.
источник
как цитировал Дрю Ноакс, kotlin использует оператор if в качестве выражения, поэтому тернарный условный оператор больше не нужен,
но с помощью функции расширения и инфиксной перегрузки вы можете реализовать это самостоятельно, вот пример
затем используйте это так
источник
Еще один интересный подход будет использовать
when
:Может быть весьма удобно в некоторых более сложных сценариях. И, честно говоря, это более читабельно для меня, чем
if ... else ...
источник
Вы можете сделать это по-разному в Kotlin
Используя если
Использование когда
Нулевая безопасность
источник
В Котлине нет никакой троичной операции, но есть несколько забавных способов обойти это. Как отмечали другие, прямой перевод на Kotlin будет выглядеть так:
Но лично я думаю, что это может стать немного загроможденным и трудным для чтения. Есть несколько других опций, встроенных в библиотеку. Вы можете использовать takeIf {} с оператором elvis:
Здесь происходит то, что команда takeIf {} возвращает либо ваш result1, либо null, а оператор elvis обрабатывает нулевую опцию. Есть несколько дополнительных опций, takeUnless {}, например:
Язык понятен, вы знаете, что он делает.
Если это часто используемое условие, вы также можете сделать что-нибудь интересное, например, использовать метод встроенного расширения. Давайте предположим, что мы хотим отслеживать счет игры как, например, Int, и мы хотим всегда возвращать 0, если данное условие не выполняется:
Хорошо, это выглядит некрасиво. Но посмотрим, как это выглядит, когда он используется:
Как вы можете видеть, Kotlin предлагает большую гибкость при выборе способа выражения вашего кода. Есть бесчисленное множество вариантов моих примеров и, возможно, способов, которые я еще даже не обнаружил. Надеюсь, это поможет!
источник
takeIf
это действительно мой любимый вариант, очень элегантный.Помните, что тернарный оператор и оператор Элвиса имеют разные значения в котлинском языке, в отличие от многих популярных языков. Выполнение
expression? value1: value2
дало бы вам плохие слова от компилятора Kotlin , в отличие от любого другого языка, поскольку в Kotlin нет ни одного троичного оператора, как упомянуто в официальных документах . Причина в том, что операторы if, when и try-catch сами возвращают значения.Таким образом, делать
expression? value1: value2
можно заменитьОператор Элвиса, который есть у Котлина , работает только в случае обнуляемых переменных, например:
Из этих ответов можно достичь более четкого понимания .
источник
Вы можете использовать
if
выражение для этого в Kotlin. В Kotlinif
есть выражение со значением результата. Так что в Котлине мы можем написатьи в Java мы можем добиться того же, но с большим кодом
источник
Если вам не нужно использовать стандартную нотацию, вы также можете создать / смоделировать ее, используя infix, примерно так:
создайте класс для хранения вашей цели и результата:
создать некоторые инфиксные функции для симуляции троичной операции
Тогда вы сможете использовать его так:
источник
Еще один короткий подход к использованию
Здесь kotlin сам проверяет нулевое значение, и если он равен нулю, он передает пустое строковое значение.
источник
Зачем использовать что-то вроде этого:
когда вы можете использовать что-то вроде этого (
a
в данном случае это логическое значение):источник
? and :
противоречит декларации типа nullable / type, а не проверке типа. Кроме этого я не вижу никакой причины. Я думаю, что кто-то определенно мог бы подумать, если есть встроенная проверка условий if-else. Давайте подождем и посмотрим в будущих версиях.При работе с apply (), пусть кажется очень удобным при работе с троичными операциями, так как это более элегантно и дает вам место
источник
Со следующими инфиксными функциями я могу охватить многие распространенные случаи использования почти так же, как это можно сделать в Python:
источник
В Котлине нет троичного оператора, наиболее закрытыми являются следующие два случая,
Справочные документы
источник
В kotlin, если вы используете ?: Это будет работать так, как если бы инструкция вернула ноль тогда ?: 0 это займет 0 или что-то еще, что вы написали на этой стороне.
источник
В Kotlin вы можете использовать троичную операцию следующим образом:
val x = if(a) "add b" else "add c"
источник
После некоторых исследований других идей я получил следующий троичный оператор:
Пример (запустить здесь ):
Эта версия свободно и не конфликтует с оператором null coalescing.
источник
then
вместо имени он названyes
.