Jaki jest odpowiednik tego wyrażenia w Kotlinie?
a ? b : c
To nie jest poprawny kod w Kotlin.
kotlin
conditional-operator
Drew Noakes
źródło
źródło
Odpowiedzi:
W Kotlinie
if
wyrażenia są wyrażeniami. Zatem następujący kod jest równoważny:Ważne jest tutaj rozróżnienie między wyrażeniem a stwierdzeniem. W Javie / C # / JavaScript
if
tworzy instrukcję, co oznacza, że nie jest rozpoznawana jako wartość. Mówiąc konkretniej, nie można przypisać jej do zmiennej.Jeśli pochodzisz z języka, w którym
if
znajduje się wypowiedź, może się to wydawać nienaturalne, ale to uczucie wkrótce powinno ustąpić.źródło
when
.x = a==b
b + if (a) c else d
vs.b + (c if (a) else d)
Ten ostatni wymaga dodatkowych nawiasów. ponieważc
nie jest objęty warunkiem ielse
.Możesz zdefiniować własną
Boolean
funkcję rozszerzenia, która zwraca się,null
gdyBoolean
mafalse
zapewnić strukturę podobną do operatora trójskładnikowego:To by
a ? b : c
tłumaczyło wyrażeniea then b ?: c
tak:Aktualizacja: Ale aby zrobić więcej przełączników warunkowych podobnych do Javy, potrzebujesz czegoś takiego
infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null
println(condition then { "yes" } ?: "no")
zwracaj uwagę na lambda. jego obliczanie zawartość powinna zostać odroczone do czasu upewnićcondition
siętrue
Ten wygląda na niezgrabny, dlatego istnieje duże zapotrzebowanie na przeniesienie trójskładnikowego operatora Java do Kotlin
źródło
infix inline fun<T> Boolean.then(param: ()->T):T? = if(this) param() else null
true then { null } ?: "not-null"
?:
tutaj operator toelvis-operator
: kotlinlang.org/docs/reference/null-safety.html#elvis-operatorTL; DR
to, czego możesz użyć zamiast wyrażenia operatora trójskładnikowego
a ? b : c
.W Kotlin wiele wyrażeń kontrolnych, w tym
if
,when
a nawettry
może być używanych jako wyrażenia . Oznacza to, że mogą one mieć wynik, który można przypisać do zmiennej, zwrócony z funkcji itp.Składniowo nie ma potrzeby trójskładnikowego operatora
W wyniku wyrażeń Kotlina język tak naprawdę nie potrzebuje operatora potrójnego .
to, czego możesz użyć zamiast wyrażenia operatora trójskładnikowego
a ? b : c
.Myślę, że chodzi o to, że poprzednie wyrażenie jest bardziej czytelne, ponieważ wszyscy wiedzą, co
ifelse
robi, a? :
raczej niejasne, jeśli nie znasz już składni.Niemniej jednak muszę przyznać, że często brakuje mi wygodniejszego operatora trójskładnikowego.
Inne alternatywy
kiedy
Podczas
when
sprawdzania warunków możesz także zobaczyć konstrukcje używane w Kotlinie. Jest to również sposób na wyrażenie alternatywnych kaskad. Poniższy przykład odpowiada OT.Rozszerzenia
Jak pokazuje wiele dobrych przykładów ( Kotlin Ternary Conditional Operator ) w innych odpowiedziach, rozszerzenia mogą również pomóc w rozwiązaniu twojego przypadku użycia.
źródło
Dla siebie korzystam z następujących funkcji rozszerzających:
Pierwszy zwróci podaną wartość domyślną, jeśli obiekt jest równy null. Drugi oceni wyrażenie podane w lambda w tym samym przypadku.
Stosowanie:
Osobiście dla mnie kod powyżej bardziej czytelny niż
if
wstawianie konstrukcjiźródło
e.getMessage() ?: "unknown"
. Drugi można wyrazić jakoobj?.lastMessage?.timestamp ?: { Date() }()
Jawny odpowiednik operatora trójskładnikowego
to prosty IF w Kotlinie w jednej linii
https://kotlinlang.org/docs/reference/control-flow.html#if-expression
Specjalny przypadek dla porównania Null
możesz skorzystać z operatora Elvisa
źródło
W kotlin nie ma operatora trójskładnikowego , ponieważ
if else
blok zwraca wartośćwięc możesz zrobić:
val max = if (a > b) a else b
zamiast javamax = (a > b) ? b : c
Możemy również użyć
when
konstrukcji, to także zwraca wartość:Oto link do dokumentacji kotlin: Control Flow: if, when, for, while
źródło
źródło
Niektóre przypadki narożne niewymienione w innych odpowiedziach.
Od momentu pojawienia się takeIf w Kotlin 1.1 operator trójskładnikowy
a ? b : c
można również wyrazić w następujący sposób:Staje się to jeszcze krótsze, gdy c wynosi
null
:Zauważ też, że typowe w świecie Java kontrole zerowe, takie jak
value != null ? value : defaultValue
przetłumaczenie ideomatycznego Kotlina na justvalue ?: defaultValue
.Podobne
a != null ? b : c
można przetłumaczyć naa?.let { b } ?: c
.źródło
b.takeIf { a } ?: c
krótszy i bardziej czytelny niżif (a) b else c
? Operator Terneray jest z pewnością brakującą cechą w Kotlin, ponieważ nazwy zmiennych i warunek mogą być długie i powodować, że dzielisz linię, która jest złatakeIf
zawsze ocenia prawdziwy przypadek (tutaja
). To wyrażenie może być nie tylko bezużyteczne, jeśli okażea
się fałszywe, ale nie możesz skorzystać z inteligentnych rzutów à laif (a is Int) { a + 3 }
.{ a }
to leniwie oceniana lambda.b
)”. Ale nawet{ a }
leniwy musi zostać oceniony, aby określić wynik wyrażenia.Spójrz na dokumenty :
źródło
Jawa
Odpowiednik Kotlin :
źródło
ZADANIE :
Rozważmy następujący przykład:
Potrzebujemy następującego odpowiednika w Kotlin:
ROZWIĄZANIA :
1.a . Możesz użyć
if-expression
w Kotlin:1.b . Może być znacznie lepiej, jeśli odwrócisz to
if-expression
(zróbmy to beznot
):2 . Operator Elvisa z Kotlin
?:
może wykonać pracę jeszcze lepiej:3 . Lub użyj
Extension function
dla odpowiedniejAnswer
klasy:4 . Za pomocą
Extension function
możesz zmniejszyć kod dziękiElvis operator
:5 . Lub po prostu użyj
when
operatora:Mam nadzieję że to pomoże.
źródło
po zastąpieniu operatora przełączania języków podobnych do C. W najprostszej formie wygląda to tak
źródło
when
wyrażenie, a nie wyrażenie. Bardziej odpowiednie porównanie z trójskładnikowymi wyrażeniami warunkowymi polega na tym, aby każda gałąź zwróciła wartość, tak że całe wyrażenie po wyrażeniu zwraca wartość (jak ma to miejsce w przypadku trójkowych wyrażeń warunkowych).W Kotlinie nie ma operatora trójskładnikowego. Na pierwszy rzut oka wydaje się to problematyczne. Ale pomyśl, że możemy to zrobić za pomocą instrukcji inline if else, ponieważ jest to wyrażenie tutaj. Po prostu musimy zrobić -
Tutaj możemy jeszcze zablokować zbyt wiele, ile potrzebujemy. Lubić-
Ta linia jest więc tak prosta i czytelna jak operator trójskładnikowy. kiedy używamy więcej niż jednego trójskładnikowego operatora w Javie, wydaje się to okropne. Ale tutaj mamy jasną składnię. nawet my możemy napisać to w wielu wierszach.
źródło
Możesz użyć
var a= if (a) b else c
zamiast operatora trójskładnikowego.Kolejną dobrą koncepcją kotlina jest Elvis. Nie musisz za każdym razem sprawdzać wartości null.
Zwróci długość, jeśli b nie ma wartości null, w przeciwnym razie wykona instrukcję po prawej stronie.
źródło
jak cytował Drew Noakes, kotlin używa instrukcji if jako wyrażenia, więc Ternary Operator warunkowy nie jest już potrzebny,
ale z funkcją rozszerzenia i przeciążeniem infix możesz sam to zaimplementować, oto przykład
następnie użyj tego w ten sposób
źródło
Innym ciekawym podejściem byłoby użycie
when
:Może być bardzo przydatny w niektórych bardziej złożonych scenariuszach. I szczerze mówiąc, jest to dla mnie bardziej czytelne niż
if ... else ...
źródło
Możesz to zrobić na wiele sposobów w Kotlinie
Używanie if
Używanie kiedy
Brak bezpieczeństwa
źródło
W Kotlinie nie ma operacji trójskładnikowych, ale istnieją fajne sposoby obejścia tego. Jak zauważyli inni, bezpośrednie tłumaczenie na Kotlin wyglądałoby tak:
Ale osobiście uważam, że może to być trochę zagracone i trudne do odczytania. Istnieje kilka innych opcji wbudowanych w bibliotekę. Możesz użyć takeIf {} z operatorem elvis:
To, co się dzieje, polega na tym, że komenda takeIf {} zwraca albo wynik1 albo null, a operator elvis obsługuje opcję null. Istnieją dodatkowe opcje, takeUnless {}, na przykład:
Język jest jasny, wiesz, co się dzieje.
Jeśli jest to często używany warunek, możesz także zrobić coś fajnego, na przykład użyć wbudowanej metody rozszerzenia. Załóżmy, że chcemy na przykład śledzić wynik gry jako Int i chcemy zawsze zwracać 0, jeśli dany warunek nie jest spełniony:
Ok, to wydaje się brzydkie. Zastanów się jednak, jak to wygląda, gdy jest używane:
Jak widać, Kotlin oferuje dużą elastyczność w sposobie wyrażania kodu. Istnieją niezliczone warianty moich przykładów i prawdopodobnie sposoby, których jeszcze nie odkryłem. Mam nadzieję, że to pomoże!
źródło
takeIf
to rzeczywiście moja ulubiona opcja, bardzo elegancka.Pamiętaj, że operator trójskładnikowy i operator Elvisa mają odrębne znaczenia w Kotlin, w przeciwieństwie do wielu popularnych języków. Spowodowałoby
expression? value1: value2
to złe słowa kompilatora Kotlin , w przeciwieństwie do innych języków, ponieważ w Kotlinie nie ma potrójnego operatora, jak wspomniano w oficjalnych dokumentach . Powodem jest to, że same instrukcje if, kiedy i try-catch zwracają wartości.Tak więc robienie
expression? value1: value2
można zastąpićOperator Elvis że Kotlin ma, działa tylko w przypadku wartości pustych zmiennych np .:
Dzięki tym odpowiedziom można lepiej zrozumieć .
źródło
Możesz użyć
if
do tego wyrażenia w Kotlinie. W Kotlinieif
jest wyrażenie z wartością wynikową. W Kotlinie możemy pisaća w Javie możemy osiągnąć to samo, ale z większym kodem
źródło
Jeśli nie używasz standardowej notacji, możesz ją również utworzyć / symulować za pomocą infix z czymś takim:
utwórz klasę, aby utrzymać swój cel i wynik:
utwórz niektóre funkcje poprawki, aby zasymulować operację potrójną
Następnie będziesz mógł użyć go w następujący sposób:
źródło
Kolejne krótkie podejście do użycia
Tutaj sam kotlin sprawdza wartość zerową, a jeśli jest zerowy, to przekazuje pustą wartość ciągu.
źródło
Dlaczego miałby używać czegoś takiego:
kiedy możesz użyć czegoś takiego (
a
w tym przypadku jest to boolean):źródło
? and :
sprzeczne z deklaracją zerowania / typu, a nie z kontrolą typu. Poza tym nie widzę żadnego powodu. Myślę, że ktoś na pewno by się nad tym zastanowił, jeśli istnieje wbudowana kontrola warunku „jeśli-inaczej”. Poczekajmy i zobaczymy w przyszłych wersjach.Podczas pracy z funkcją apply () wydaje się bardzo przydatna w przypadku operacji trójkowych, ponieważ jest bardziej elegancka i daje ci miejsce
źródło
Dzięki następującym funkcjom poprawki mogę objąć wiele typowych przypadków użycia w taki sam sposób, jak w Pythonie:
źródło
W Kotlinie nie ma operatora trójskładnikowego, najbardziej zamknięte są poniższe dwa przypadki,
Dokumenty referencyjne
źródło
W kotlin, jeśli używasz ?: To będzie działało tak, jakby instrukcja zwróciła null, to ?: 0 zajmie 0 lub cokolwiek, co masz napisać po tej stronie.
źródło
W Kotlin możesz użyć operacji trójskładnikowej w następujący sposób:
val x = if(a) "add b" else "add c"
źródło
Po kilku badaniach innych pomysłów, wyprowadziłem następujący operator trójskładnikowy:
Przykład (uruchom tutaj ):
Ta wersja jest płynna i nie koliduje z zerowym operatorem koalescencji.
źródło
then
zamiastyes
.