Vodič za blok “kada {}” u Kotlinu

1. Uvod

Ovaj vodič predstavlja kada{} blok na jeziku Kotlin i pokazuje razne načine na koje se može koristiti.

Da bi se razumjelo gradivo u ovom članku, potrebno je osnovno znanje jezika Kotlin. Možete pogledati uvod u članak Kotlin Language o Baeldungu da biste saznali više o tom jeziku.

2. Kotlinova kada{} Blok

Kada{} blok je u osnovi napredni oblik preklopno kućište izjava poznata s Jave.

Ako se u Kotlinu pronađe odgovarajući slučaj, izvršava se samo kôd u odgovarajućem bloku slučaja i izvršavanje se nastavlja sa sljedećim izrazom nakon kada blok. To u osnovi znači da na kraju svake izjave o prekidu nisu potrebne slučaj blok.

Da bi se demonstrirala upotreba kada{}, definirajmo klasu enum koja sadrži prvo slovo u polju dozvola za neke vrste datoteka u Unixu:

enum klasa UnixFileType {D, HYPHEN_MINUS, L} 
Definirajmo također hijerarhiju klasa koje modeliraju odgovarajuće vrste datoteka Unix:
zapečaćena klasa UnixFile {apstraktna zabava getFileType (): UnixFileType klasa RegularFile (val sadržaj: String): UnixFile () {nadjačati zabavu getFileType (): UnixFileType {return UnixFileType.HYPHEN_MINUS}} direktorij klase (val djeca: popis): UnixFile () {override fun getFileType (): UnixFileType {return UnixFileType.D}} class SymbolicLink (val originalFile: UnixFile): UnixFile () {override fun getFileType (): UnixFileType {return UnixFileType.L}}} 

2.1. Kada{} kao Izraz

Velika razlika od Java-ove naredbe switch je ta the kada{} blok u Kotlinu može se koristiti i kao iskaz i kao izraz. Kotlin slijedi principe ostalih funkcionalnih jezika, a strukture za kontrolu protoka su izrazi i rezultat njihove evaluacije može se vratiti pozivatelju.

Ako je vraćena vrijednost dodijeljena varijabli, sastavljač će provjeriti je li vrsta povratne vrijednosti kompatibilna s tipom koju očekuje klijent i obavijestit će nas u slučaju da nije:

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

Dvije su stvari koje treba primijetiti kada se koristi kao izraz u Kotlinu.

Prvo, vrijednost koja se vraća pozivatelju je vrijednost odgovarajućeg bloka slučaja ili drugim riječima posljednja definirana vrijednost u bloku.

Druga stvar koju treba primijetiti jest da moramo garantirati da pozivatelj dobiva vrijednost. Da bi se to dogodilo moramo osigurati da slučajevi, u bloku when, pokrivaju svaku moguću vrijednost koja se može dodijeliti argumentu.

2.2. Kada{} kao izraz sa zadanim slučajem

Zadani će se slučaj podudarati s bilo kojom vrijednošću argumenta koja se ne podudara s uobičajenim slučajem, a u Kotlinu se deklarira pomoću drugo klauzula. U svakom slučaju, kompajler Kotlin pretpostavit će da je svaka moguća vrijednost argumenta pokrivena blokom when i žalit će se u slučaju da nije.

Da dodam zadani slučaj u Kotlinovom kada izraz:

@Test fun testWhenExpressionWithDefaultCase () {val fileType = UnixFileType.L val result = when (fileType) {UnixFileType.L -> "link to another file" else -> "not a link"} assertEquals ("povezivanje s drugom datotekom", rezultat)} 

2.3. When {} Izraz s slučajem koji donosi izuzetak

U Kotlinu, bacanje vraća vrijednost tipa Ništa.

U ovom slučaju, Ništa koristi se za izjavu da izraz nije uspio izračunati vrijednost. Ništa je tip koji nasljeđuje od svih korisnički definiranih i ugrađenih tipova u Kotlinu.

Stoga, budući da je tip kompatibilan s bilo kojim argumentom koji bismo koristili u a kada blok, savršeno je valjano izuzeti iz a slučaj čak i ako je kada blok koristi se kao izraz.

Definirajmo izraz izraz kada jedan od slučajeva donosi iznimku:

@Test (očekuje se = IllegalArgumentException :: class) fun testWhenExpressionWithThrowException () {val fileType = UnixFileType.L val rezultat: Boolean = when (fileType) {UnixFileType.HYPHEN_MINUS -> true else -> baciti IllegalArgumentEx) type "IllegalArgumentEx" }} 

2.4. Kada{} Koristi se kao Izjava

Također možemo koristiti kada blok kao izjava.

U ovom slučaju, ne trebamo pokriti svaku moguću vrijednost za argument, a vrijednost izračunata u svakom bloku slučaja, ako postoji, samo se zanemaruje. Kad se koristi kao izjava, kada blok može se koristiti slično kao i sklopka Izjava se koristi u Javi.

Iskoristimo kada blokiraj kao izjavu:

@Test fun testWhenStatement () {val fileType = UnixFileType.HYPHEN_MINUS when (fileType) {UnixFileType.HYPHEN_MINUS -> println ("Regular type type") UnixFileType.D -> println ("File type type")}} 

Iz primjera možemo vidjeti da nije obavezno pokriti sve moguće vrijednosti argumenata kada ih koristimo kada kao izjava.

2.5. Kombinirajući Kada{} Slučajevi

Kotlinova kada izraz nam omogućuje kombiniranje različitih slučajeva u jedan spajanjem uvjeta podudaranja zarezom.

Samo se jedan slučaj mora podudarati s odgovarajućim blokom koda koji će se izvršiti, pa zarez djeluje kao ILI operater.

Stvorimo slučaj koji kombinira dva uvjeta:

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

2.6. Kada{} Koristi se bez argumenta

Kotlin nam dopušta da izostavimo vrijednost argumenta u kada blok.

To se u biti pretvara u jednostavnom ako-inače izraz koji sekvencijalno provjerava slučajeve i izvršava blok koda prvog podudarnog slučaja. Ako izostavimo argument u bloku kada, tada bi izrazi slučaja trebali biti istiniti ili netačni.

Stvorimo a kada blok koji izostavlja argument:

@Test fun testWhenWithoutArgument () {val fileType = UnixFileType.L val objectType = when {fileType === UnixFileType.L -> "l" fileType === UnixFileType.HYPHEN_MINUS -> "-" fileType === UnixFileType.D - > "d" else -> "nepoznata vrsta datoteke"} assertEquals ("l", objectType)} 

2.7. Dinamični izrazi velikih i malih slova

U Javi je sklopka Izjava se može koristiti samo s primitivima i njihovim uokvirenim tipovima, enumima i Niz razred. U kontrastu, Kotlin nam omogućuje upotrebu kada blok s bilo kojim ugrađenim ili korisnički definiranim tipom.

Uz to, nije potrebno da su slučajevi konstantni izrazi kao u Javi. Slučajevi u Kotlinu mogu biti dinamički izrazi koji se vrednuju u vrijeme izvođenja. Na primjer, slučajevi mogu biti rezultat funkcije sve dok je vrsta povrata funkcije kompatibilna s vrstom funkcije kada blok argument.

Definirajmo a kada blok s dinamičkim izrazima slova:

@Test fun testDynamicCaseExpression () {val unixFile = UnixFile.SymbolicLink (UnixFile.RegularFile ("Content")) kada je {unixFile.getFileType () == UnixFileType.D -> println ("To je direktorij!") UnixFile.getFileType ( ) == UnixFileType.HYPHEN_MINUS -> println ("To je redovna datoteka!") UnixFile.getFileType () == UnixFileType.L -> println ("To je meka veza!")}} 

2.8. Izrazi slučaja dometa i zbirke

Moguće je definirati slučaj u a kada blok koji provjerava sadrži li zadana zbirka ili raspon vrijednosti argument.

Iz tog razloga Kotlin daje u operator, što je sintaksički šećer za sadrži () metoda. To znači da iza kulisa Kotlin prevodi element slučaja u do collection.contens (element).

Da biste provjerili nalazi li se argument na popisu:

@Test fun testCollectionCaseExpressions () {val regularFile = UnixFile.RegularFile ("Test Content") val symbolicLink = UnixFile.SymbolicLink (regularFile) val directory = UnixFile.Directory (listOf (regularFile, symbolicLink)) val isRegularFileInDirectory = kada (regular u directory.children -> true else -> false} val isSymbolicLinkInDirectory = kada je {symbolicLink u directory.children -> true else -> false} assertTrue (isRegularFileInDirectory) assertTrue (isSymbolicLinkInDirectory)} 
Da biste provjerili je li argument u rasponu:
@Test fun testRangeCaseExpressions () {val fileType = UnixFileType.HYPHEN_MINUS val isCorrectType = when (fileType) {u UnixFileType.D..UnixFileType.L -> true else -> false} assertTrue (isCorrectType)} 

Čak iako REDOVNA_FILE Tip nije eksplicitno sadržan u rasponu, njegov je redni broj između rednih brojeva IMENIK i SYMBOLIC_LINK i stoga je test uspješan.

2.9. Je Case Operator i Smart Cast

Možemo se poslužiti Kotlinovim je operator da provjeri je li argument instanca određenog tipa. The je operator sličan je instanceof operater u Javi.

Međutim, Kotlin nam pruža značajku koja se naziva "pametna uloga". Nakon što provjerimo je li argument instanca određenog tipa, ne moramo izričito prebaciti argument na taj tip budući da to za nas radi prevoditelj.

Stoga metode i svojstva definirana u danom tipu možemo koristiti izravno u bloku slučaja.

Da biste koristili operatora is sa značajkom "pametnog lijevanja" u a kada blok:

@Test fun testWhenWithIsOperatorWithSmartCase () {val unixFile: UnixFile = UnixFile.RegularFile ("Test Content") val rezultat = when (unixFile) {is UnixFile.RegularFile -> unixFile.content is UnixFile.Directory -> unixFile.children>> unixFile.child it.getFileType ()} .joinToString (",") je UnixFile.SymbolicLink -> unixFile.originalFile.getFileType ()} assertEquals ("Test Content", rezultat)} 
Bez izričitog lijevanja unixFile do RegularFile, Imenik ili SymbolicLink, mogli smo koristiti RegularFile.content, Imenik.djeca, i SymbolicLink.originalFile odnosno.

2.10. kada Izrazi i petlje

Od Kotlina 1.4 to je moguće pauza ili nastaviti petlja čak i unutar a kada izraz. Na primjer:

val colors = setOf ("Red", "Green", "Blue") for (boja u bojama) {when (color) {"Red" -> break "Green" -> continue "Blue" -> println ("This je plava ")}}

U gornjem primjeru, pauza završava najbližu zatvaračku petlju i nastaviti nastavlja se prema sljedećem koraku, kako se očekivalo. Prije Kotlina 1.4, međutim, samo se kvalificirao pauza i nastaviti bilo dopušteno u a kada izraz unutar petlje:

[e-pošta zaštićena] za (boja u bojama) {kada (boja) {"Crvena" -> [e-pošta zaštićena] "Zelena" -> [e-pošta zaštićena] "Plava" -> println ("Ovo je plava")}}

Kao što je gore prikazano, pauza i nastaviti kvalificirani su za @PETLJA izraz.

3. Zaključak

U ovom smo članku vidjeli nekoliko primjera kako koristiti kada blok koji nudi jezik Kotlin.

Iako nije moguće podudaranje uzoraka pomoću kada u Kotlinu, kao što je slučaj s odgovarajućim strukturama u Scali i drugim JVM jezicima, kada blok je dovoljno svestran da bismo potpuno zaboravili na ove značajke.

Kompletna primjena primjera za ovaj članak može se naći na GitHubu.