Útmutató a „mikor {}” blokkhoz Kotlinban

1. Bemutatkozás

Ez az oktatóanyag bemutatja a mikor{} blokk Kotlin nyelven, és bemutatja a felhasználásának különféle módjait.

A cikk anyagának megértéséhez alapvető ismeretekre van szükség a Kotlin nyelvről. Megtekintheti a Koteld nyelv Baeldungról szóló cikkének bevezetőjét, hogy többet megtudjon a nyelvről.

2. Kotliné mikor{} Blokk

Mikor{} blokk lényegében a kapcsolószekrény Java-ból ismert utasítás.

Kotlinban, ha talál egyező esetet, akkor csak az adott esetblokkban lévő kód kerül végrehajtásra, és a végrehajtás a következő utasítással folytatódik a mikor Blokk. Ez lényegében azt jelenti, hogy mindegyik végén nincs szükség törésmondatokra ügy Blokk.

A. Használatának bemutatása mikor{}, definiáljunk egy enum osztályt, amely az első betűt tartalmazza az engedélyek mezőjében a Unix egyes fájltípusaihoz:

enum osztály UnixFileType {D, HYPHEN_MINUS, L} 
Határozzunk meg olyan osztályok hierarchiáját is, amelyek a megfelelő Unix fájltípusokat modellezik:
sealed class UnixFile {abstract fun getFileType (): UnixFileType class RegularFile (val content: String): UnixFile () {override fun getFileType (): UnixFileType {return UnixFileType.HYPHEN_MINUS}} class Directory (val children: List): UnixFileType class {override fun getFileType (): UnixFileType {return UnixFileType.D}} class SymbolicLink (val originalFile: UnixFile): UnixFile () {override fun getFileType (): UnixFileType {return UnixFileType.L}}} 

2.1. Mikor{} mint Kifejezés

Nagy különbség a Java kapcsoló nyilatkozatától az, hogy a mikor{} blokk Kotlinban használható utasításként és kifejezésként is. Kotlin követi más funkcionális nyelvek elveit, és az áramlásszabályozó struktúrák kifejezések, és értékelésük eredménye visszaküldhető a hívónak.

Ha a visszaküldött értéket egy változóhoz rendeljük, a fordító ellenőrzi, hogy a visszatérési érték típusa kompatibilis-e az ügyfél által elvárt típussal, és tájékoztat minket, ha nem:

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

Két dolgot kell észrevenni, amikor a kifejezést használjuk Kotlinban.

Először is, a hívónak visszaküldött érték a megfelelő esetblokk értéke vagy más szavakkal a blokk utolsó definiált értéke.

A második dolog, amit észre kell venni, hogy garantálnunk kell, hogy a hívó értéket kapjon. Ahhoz, hogy ez megtörténjen, meg kell győződnünk arról, hogy az esetek a mikor blokkban minden lehetséges értéket lefednek, amely hozzárendelhető az argumentumhoz.

2.2. Mikor{} mint kifejezés alapértelmezett esettel

Az alapértelmezett eset megegyezik minden olyan argumentumértékkel, amely nem felel meg egy normál esetnek, és Kotlinban a más kikötés. Mindenesetre a Kotlin fordító azt feltételezi, hogy minden lehetséges argumentumértéket lefed a mikor blokk, és panaszt tesz, ha nem.

Alapértelmezett eset hozzáadása Kotlin-ban mikor kifejezés:

@Test fun testWhenExpressionWithDefaultCase () {val fileType = UnixFileType.L val result = when (fileType) {UnixFileType.L -> "másik fájlra való hivatkozás" más -> "nem link"} assertEquals ("másik fájlra való hivatkozás", eredmény)} 

2.3. Amikor {} Kifejezés kivétellel járó esettel

Kotlinban, dobás típusú értéket ad vissza Semmi.

Ebben az esetben, Semmi arra használják, hogy kijelentse, hogy a kifejezés nem tudott értéket kiszámítani. Semmi az a típus, amely Kotlin összes felhasználó által definiált és beépített típusától örököl.

Ezért, mivel a típus kompatibilis minden olyan argumentummal, amelyet a mikor blokk, akkor teljesen érvényes, ha kivételt vetünk az a-ból ügy még ha a mikor blokkot használunk kifejezésként.

Határozzunk meg egy mikor kifejezést, ahol az egyik eset kivételt hoz:

@Test (várható = IllegalArgumentException :: class) szórakoztató tesztWhenExpressionWithThrowException () {val fileType = UnixFileType.L val eredmény: Boolean = mikor (fileType) {UnixFileType.HYPHEN_MINUS -> true else -> dobja az IllegalArgument ( }} 

2.4. Mikor{} Nyilatkozatként használják

Használhatjuk a mikor blokk állításként.

Ebben az esetben nem kell lefednünk az argumentum minden lehetséges értékét, és az egyes esetek blokkjában kiszámított értéket, ha van ilyen, csak figyelmen kívül hagyjuk. Ha állításként használjuk, a mikor blokk hasonlóan használható, mint a kapcsoló utasítás a Java-ban használatos.

Használjuk a mikor blokk állításként:

@Test fun testWhenStatement () {val fileType = UnixFileType.HYPHEN_MINUS mikor (fileType) {UnixFileType.HYPHEN_MINUS -> println ("Rendszeres fájltípus") UnixFileType.D -> println ("Directory fájltípus")}} 

A példából láthatjuk, hogy nem kötelező minden lehetséges argumentumértéket lefedni, amikor használjuk mikor állításként.

2.5. Kombinálás Mikor{} Esetek

Kotliné mikor A kifejezés lehetővé teszi számunkra, hogy a különböző eseteket egyesítsük egybe az illesztési feltételek vesszővel való összefűzésével.

Csak egy esetnek kell egyeznie az adott kódblokk végrehajtásához, ezért a vessző névként működik VAGY operátor.

Hozzunk létre egy olyan esetet, amely két feltételt ötvöz:

@Test fun testCaseCombination () {val fileType = UnixFileType.D val commonFileType: Boolean = mikor (fileType) {UnixFileType.HYPHEN_MINUS, UnixFileType.D -> igaz más -> hamis} assertTrue (gyakoriFileType)} 

2.6. Mikor{} Érv nélkül használt

Kotlin lehetővé teszi számunkra, hogy kihagyjuk az argumentum értékét a mikor Blokk.

Ez lényegében megfordul, ha egy egyszerű ha-elseif kifejezés, amely szekvenciálisan ellenőrzi az eseteket és végrehajtja az első egyező eset kódblokkját. Ha elhagyjuk az argumentumot a mikor blokkban, akkor az esetkifejezéseknek igaznak vagy hamisnak kell lenniük.

Hozzunk létre egy mikor blokk, amely kihagyja az argumentumot:

@Test fun testWhenWithoutArgument () {val fileType = UnixFileType.L val objectType = when {fileType === UnixFileType.L -> "l" fileType === UnixFileType.HYPHEN_MINUS -> "-" fileType === UnixFileTy > "d" else -> "ismeretlen fájltípus"} assertEquals ("l", objectType)} 

2.7. Dinamikus esetkifejezések

Java-ban az kapcsoló utasítás csak primitívekkel és azok dobozos típusaival, enumokkal és a Húr osztály. Ellentétben, Kotlin lehetővé teszi számunkra a mikor blokk bármilyen beépített vagy felhasználó által definiált típussal.

Ezenkívül nem szükséges, hogy az esetek állandó kifejezések legyenek, mint a Java-ban. A kotlini esetek dinamikus kifejezések lehetnek, amelyeket futás közben értékelnek. Például az esetek egy függvény eredményei lehetnek, amennyiben a függvény visszatérési típusa kompatibilis a függvény típusával mikor blokk argumentum.

Határozzuk meg a mikor blokk dinamikus nagybetűkkel:

@Test fun testDynamicCaseExpression () {val unixFile = UnixFile.SymbolicLink (UnixFile.RegularFile ("Content")), amikor {unixFile.getFileType () == UnixFileType.D -> println ("Ez egy könyvtár!") UnixFy.getF ) == UnixFileType.HYPHEN_MINUS -> println ("Ez egy rendes fájl!") UnixFile.getFileType () == UnixFileType.L -> println ("Ez egy soft link!")}} 

2.8. Tartomány és gyűjtési eset kifejezések

Lehetséges esetet definiálni a mikor blokk, amely ellenőrzi, hogy egy adott gyűjtemény vagy értéktartomány tartalmazza-e az argumentumot.

Emiatt Kotlin biztosítja a ban ben operátor, ami szintaktikus cukor a tartalmaz () módszer. Ez azt jelenti, hogy a kulisszák mögött Kotlin lefordítja az eset elemét ban ben nak nek collection.contains (elem).

Annak ellenőrzéséhez, hogy az argumentum szerepel-e egy listában:

@Test fun testCollectionCaseExpressions () {val regularFile = UnixFile.RegularFile ("Teszt tartalma") val symbolicLink = UnixFile.SymbolicLink (regularFile) val könyvtár = UnixFile.Directory (listOf (regularFile, symbolicLink)) val isRegularFileInDialory in directory.children -> true else -> false} val isSymbolicLinkInDirectory = when {symbolicLink in directory.children -> true else -> false} assertTrue (isRegularFileInDirectory) assertTrue (isSymbolicLinkInDirectory)} 
Annak ellenőrzése, hogy az argumentum tartományban van-e:
@Test fun testRangeCaseExpressions () {val fileType = UnixFileType.HYPHEN_MINUS val isCorrectType = when (fileType) {in UnixFileType.D..UnixFileType.L -> true else -> false} assertTrue (isCorrectType)} 

Annak ellenére REGULAR_FILE típusa nem szerepel kifejezetten a tartományban, annak sorszáma a KÖNYVTÁR és SYMBOLIC_LINK és ezért a teszt sikeres.

2.9. Is Ügykezelő és Smart Cast

Használhatjuk Kotlinét van operátor ellenőrizze, hogy az argumentum egy adott típusú példány. A van operátor hasonló a Például az operátor Java-ban.

Kotlin azonban biztosít nekünk egy „smart cast” nevű funkciót. Miután megvizsgáltuk, hogy az argumentum egy adott típusú példány-e, nem kell kifejezetten az adott argumentumra átvetnünk az argumentumot, mivel a fordító ezt teszi helyettünk.

Ezért közvetlenül az esetblokkban használhatjuk az adott típusban meghatározott módszereket és tulajdonságokat.

Az is operátor használata a „smart cast” funkcióval a mikor Blokk:

@Test fun testWhenWithIsOperatorWithSmartCase () {val unixFile: UnixFile = UnixFile.RegularFile ("Test Content") val result = when (unixFile) {is UnixFile.RegularFile -> unixFile.content is UnixFile.Directory -> unixFile az it.getFileType ()} .joinToString (",") UnixFile.SymbolicLink -> unixFile.originalFile.getFileType ()} assertEquals ("Teszt tartalma", eredmény)} 
Kifejezett casting nélkül unixFile nak nek RegularFile, Könyvtár vagy SymbolicLink, tudtuk használni RegularFile.content, Directory.gyerekek, és SymbolicLink.originalFile illetőleg.

2.10. mikor Kifejezések és hurkok

A Kotlin 1.4-től lehetséges szünet vagy folytatni egy hurok még a belsejében is mikor kifejezés. Például:

val színek = setOf ("Piros", "Zöld", "Kék") a (szín színekben) {mikor (szín) {"Piros" -> törés "Zöld" -> folytatás "Kék" -> println ("Ez kék ")}}

A fenti példában szünet befejezi a legközelebbi záróhurkot és a folytatni a várakozásoknak megfelelően folytatja a következő lépést. A Kotlin 1.4 előtt azonban csak kvalifikált szünet és folytatni beengedték a mikor kifejezés egy hurok belsejében:

[email protected] for (színes színben) {when (color) {"Red" -> [email protected] "Green" -> [email protected] "Blue" -> println ("This is blue")}}

Amint fentebb látható, a szünet és folytatni képesítéssel rendelkeznek a @HUROK kifejezés.

3. Következtetés

Ebben a cikkben számos példát láthattunk a mikor a Kotlin nyelv által kínált blokk.

Annak ellenére, hogy a mintaillesztés nem lehetséges mikor Kotlinban, hasonlóan a Scala és más JVM nyelv megfelelő struktúráihoz, az mikor A blokk elég sokoldalú ahhoz, hogy teljesen megfeledkezzünk ezekről a funkciókról.

A cikk példáinak teljes megvalósítása a GitHub oldalon található.