Sprievodca blokovaním „keď {}“ v Kotline

1. Úvod

Tento tutoriál predstavuje kedy{} blok v jazyku Kotlin a demonštruje rôzne spôsoby, ako ho možno použiť.

Na pochopenie materiálu v tomto článku sú potrebné základné znalosti jazyka Kotlin. Môžete sa pozrieť na úvod do článku o jazyku Kotlin Language o Baeldungu, kde sa dozviete viac o tomto jazyku.

2. Kotlinova kedy{} Blokovať

Kedy{} blok je v podstate pokročilou formou rozvodňa vyhlásenie známe z Javy.

V Kotline, ak sa nájde zodpovedajúci prípad, vykoná sa iba kód v príslušnom bloku prípadov a vykonávanie pokračuje ďalším príkazom po kedy blokovať. To v podstate znamená, že na konci každého z nich nie sú potrebné žiadne vyhlásenia o zlomoch prípade blokovať.

Na preukázanie použitia kedy{}, definujme triedu enum, ktorá obsahuje prvé písmeno v poli povolení pre niektoré typy súborov v systéme Unix:

trieda výčtu UnixFileType {D, HYPHEN_MINUS, L} 
Definujme tiež hierarchiu tried, ktoré modelujú príslušné typy súborov Unix:
zapečatená trieda UnixFile {abstraktná zábava getFileType (): UnixFileType trieda RegularFile (obsah val: String): UnixFile () {prepísať zábavu getFileType (): UnixFileType {návrat UnixFileType.HYPHEN_MINUS}} trieda Adresár (deti: Zoznam): UnixFile {override fun getFileType (): UnixFileType {return UnixFileType.D}} class SymbolicLink (val originalFile: UnixFile): UnixFile () {override fun getFileType (): UnixFileType {return UnixFileType.L}}} 

2.1. Kedy{} ako výraz

Veľký rozdiel oproti prehláseniu Java o prepínači je v tom the kedy{} blok v Kotline je možné použiť ako príkaz aj ako výraz. Kotlin dodržiava zásady ostatných funkčných jazykov a štruktúry riadenia toku sú výrazy a výsledok ich vyhodnotenia je možné vrátiť volajúcemu.

Ak je vrátená hodnota priradená k premennej, kompilátor skontroluje, či je typ návratovej hodnoty kompatibilný s typom očakávaným klientom, a bude nás informovať, ak nie je:

@Test zábava testWhenExpression () {val directoryType = UnixFileType.D val objectType = when (directoryType) {UnixFileType.D -> "d" UnixFileType.HYPHEN_MINUS -> "-" UnixFileType.L -> "l"} assertEquals ("d" ", objectType)} 

Pri použití výrazu when ako výrazu v Kotline si treba všimnúť dve veci.

Po prvé, hodnota, ktorá sa vráti volajúcemu, je hodnota bloku zhodných prípadov alebo inými slovami posledná definovaná hodnota v bloku.

Druhá vec, ktorú si musíme všimnúť, je, že musíme zaručiť, že volajúci dostane hodnotu. Aby sme to dosiahli, musíme zabezpečiť, aby prípady v bloku when pokrývali všetky možné hodnoty, ktoré možno argumentu priradiť.

2.2. Kedy{} ako výraz s predvoleným prípadom

Predvolený prípad sa bude zhodovať s akoukoľvek hodnotou argumentu, ktorá sa nezhoduje s bežným prípadom a v Kotline sa deklaruje pomocou inak doložka. V každom prípade kompilátor Kotlin bude predpokladať, že každá možná hodnota argumentu je pokrytá blokom when, a bude sa sťažovať, ak nie je.

Ak chcete pridať predvolený prípad v Kotlinovej kedy výraz:

@ Test zábava testWhenExpressionWithDefaultCase () {val fileType = UnixFileType.L val výsledok = keď (fileType) {UnixFileType.L -> „odkaz na iný súbor“ else -> „nie odkaz“} assertEquals („odkaz na iný súbor“, výsledok)} 

2.3. Keď {} Výraz s prípadom, ktorý vyvoláva výnimku

V Kotline hodiť vráti hodnotu typu Nič.

V tomto prípade, Nič sa používa na vyhlásenie, že výraz nedokázal vypočítať hodnotu. Nič je typ, ktorý dedí zo všetkých používateľom definovaných a zabudovaných typov v Kotline.

Pretože je teda typ kompatibilný s akýmkoľvek argumentom, ktorý by sme použili v a kedy blok, je úplne platné hodiť výnimku z a prípade aj keď kedy blok sa používa ako výraz.

Definujme výraz when, kde jeden z prípadov vyvolá výnimku:

@Test (očakáva sa = IllegalArgumentException :: class) zábavný testWhenExpressionWithThrowException () {val fileType = UnixFileType.L val výsledok: Boolean = when (fileType) {UnixFileType.HYPHEN_MINUS -> true else -> hod IllegalArgumentException ("nesprávny typ súboru") }} 

2.4. Kedy{} Používa sa ako vyhlásenie

Môžeme tiež použiť kedy blok ako vyhlásenie.

V takom prípade nemusíme pokrývať všetky možné hodnoty argumentu a hodnota vypočítaná v každom prípade, ak existuje, je iba ignorovaná. Ak sa použije ako vyhlásenie, kedy blok sa dá použiť podobne ako prepínač príkaz sa používa v Jave.

Použime kedy blok ako vyhlásenie:

@Test fun testWhenStatement () {val fileType = UnixFileType.HYPHEN_MINUS when (fileType) {UnixFileType.HYPHEN_MINUS -> println ("Bežný typ súboru") UnixFileType.D -> println ("Typ adresárového súboru")}} 

Z príkladu vidíme, že nie je povinné pokryť všetky možné hodnoty argumentov, keď ich používame kedy ako vyhlásenie.

2.5. Kombinovanie Kedy{} Prípady

Kotlinova kedy výraz nám umožňuje spojiť rôzne prípady do jedného zreťazením podmienok zhody čiarkou.

Pre vykonanie príslušného bloku kódu musí zodpovedať iba jeden prípad, takže čiarka funguje ako ALEBO operátor.

Vytvorme prípad kombinujúci dve podmienky:

@Test fun testCaseCombination () {val fileType = UnixFileType.D val FrequentFileType: Boolean = when (fileType) {UnixFileType.HYPHEN_MINUS, UnixFileType.D -> true else -> false} assertTrue (FrequentFileType)} 

2.6. Kedy{} Používa sa bez argumentu

Kotlin nám umožňuje vynechať hodnotu argumentu v kedy blokovať.

Toto sa v podstate zmení na jednoduché keby-elseif výraz, ktorý postupne kontroluje prípady a vykonáva blok kódu prvého zodpovedajúceho prípadu. Ak vynecháme argument v bloku when, potom by sa výrazy veľkých a malých písmen mali vyhodnotiť ako pravdivé alebo nepravdivé.

Vytvorme a kedy blok, ktorý vynecháva argument:

@Test zábava testWhenWithoutArgument () {val fileType = UnixFileType.L val objectType = when {fileType === UnixFileType.L -> "l" fileType === UnixFileType.HYPHEN_MINUS -> "-" fileType === UnixFile = > "d" else -> "neznámy typ súboru"} assertEquals ("l", objectType)} 

2.7. Dynamické výrazy veľkých a malých písmen

V Jave sa prepínač vyhlásenie možno použiť iba s primitívmi a ich zabalenými typmi, enummi a String trieda. Naproti tomu Kotlin nám umožňuje používať kedy blok s akýmkoľvek zabudovaným alebo používateľom definovaným typom.

Okrem toho sa nevyžaduje, aby išlo o konštantné výrazy ako v prostredí Java. Prípady v Kotline môžu byť dynamické výrazy, ktoré sa vyhodnocujú za behu programu. Napríklad prípady môžu byť výsledkom funkcie, pokiaľ je návratový typ funkcie kompatibilný s typom kedy argument bloku.

Definujme a kedy blok s dynamickými výrazmi veľkých a malých písmen:

@Test zábava testDynamicCaseExpression () {val unixFile = UnixFile.SymbolicLink (UnixFile.RegularFile ("Content")), keď {unixFile.getFileType () == UnixFileType.D -> println ("Je to adresár!") UnixFile.getFileType ) == UnixFileType.HYPHEN_MINUS -> println ("Je to bežný súbor!") UnixFile.getFileType () == UnixFileType.L -> println ("Je to mäkký odkaz!")}} 

2.8. Výrazy rozsahu a zbierky

Prípad je možné definovať v a kedy blok, ktorý kontroluje, či daná kolekcia alebo rozsah hodnôt obsahuje argument.

Z tohto dôvodu poskytuje Kotlin v operátor, ktorým je syntaktický cukor pre obsahuje () metóda. To znamená, že v zákulisí Kotlin prekladá prvok prípadu v do zbierka. obsahuje (prvok).

Ak chcete skontrolovať, či je argument v zozname, postupujte takto:

@Test fun testCollectionCaseExpressions () {val regularFile = UnixFile.RegularFile ("Testovať obsah") val symbolicLink = UnixFile.SymbolicLink (regularFile) val adresár = UnixFile.Directory (listOf (regularFile, symbolicLink)) val isRegularFileInDirectory = keď (regular) v adresári.ch Children -> true else -> false} val isSymbolicLinkInDirectory = keď {symbolicLink v adresári.children -> true else -> false} assertTrue (isRegularFileInDirectory) assertTrue (isSymbolicLinkInDirectory)} 
Ak chcete skontrolovať, či je argument v rozsahu:
@Test fun testRangeCaseExpressions () {val fileType = UnixFileType.HYPHEN_MINUS val isCorrectType = when (fileType) {in UnixFileType.D..UnixFileType.L -> true else -> false} assertTrue (isCorrectType)} 

Aj napriek tomu REGULAR_FILE typ nie je výslovne obsiahnutý v rozsahu, jeho radová jednotka je medzi radovými jednotkami ADRESÁR a SYMBOLIC_LINK a preto je test úspešný.

2.9. Je Operátor prípadu a Smart Cast

Môžeme použiť Kotlinovu je operátor, ktorý skontroluje, či je argument inštanciou zadaného typu. The je operátor je podobný inštancia operátor v Jave.

Kotlin nám však poskytuje funkciu nazvanú „smart cast“. Keď skontrolujeme, či je argument inštanciou daného typu, nemusíme explicitne vrhnúť argument na tento typ, pretože to za nás robí kompilátor.

Preto môžeme priamo v bloku prípadov použiť metódy a vlastnosti definované v danom type.

Ak chcete použiť operátor is s funkciou „smart cast“ v a kedy blok:

@Test zábava testWhenWithIsOperatorWithSmartCase () {val unixFile: UnixFile = UnixFile.RegularFile ("Testovať obsah") val výsledok = keď (unixFile) {je UnixFile.RegularFile -> unixFile.content je UnixFile.Directory -> unixFile.ch it.getFileType ()} .joinToString (",") je UnixFile.SymbolicLink -> unixFile.originalFile.getFileType ()} assertEquals ("Testovať obsah", výsledok)} 
Bez výslovného obsadenia unixFile do RegularFile, Adresár alebo SymbolicLink, sme boli schopní použiť RegularFile.obsah, Adresár.detia SymbolicLink.originalFile resp.

2.10. kedy Výrazy a slučky

Od verzie Kotlin 1.4 je to možné prestávka alebo ďalej slučka aj vo vnútri a kedy výraz. Napríklad:

val colors = setOf ("Red", "Green", "Blue") for (color in colors) {when (color) {"Red" -> break "Green" -> continue "Blue" -> println ("This je modrá ")}}

Vo vyššie uvedenom príklade prestávka ukončí najbližšiu uzatvárajúcu slučku a ďalej podľa očakávania pokračuje v ďalšom kroku. Pred Kotlinom 1.4 sa však iba kvalifikoval prestávka a ďalej boli povolené v a kedy výraz vo vnútri slučky:

[chránené e-mailom] pre (farba vo farbách) {keď (farba) {"Červená" -> [chránená proti e-mailu "" Zelená "-> [chránená proti e-mailom" "Modrá" -> println („Toto je modrá")}}

Ako je uvedené vyššie, prestávka a ďalej sú kvalifikovaní s @LOOP výraz.

3. Záver

V tomto článku sme videli niekoľko príkladov, ako používať kedy blok ponúkaný jazykom Kotlin.

Aj keď nie je možné vykonať porovnávanie vzorov pomocou kedy v Kotline, ako je to v prípade zodpovedajúcich štruktúr v Scale a iných jazykoch JVM, kedy blok je dostatočne univerzálny na to, aby sme na tieto funkcie úplne zabudli.

Kompletnú implementáciu príkladov tohto článku nájdete na stránkach GitHub.


$config[zx-auto] not found$config[zx-overlay] not found