Kotlin este un limbaj de programare modern care se compilează la Java bytecode. Este gratuit și open source, și promite să facă codificarea pentru Android chiar mai distractiv.
În articolul precedent, ați învățat despre variabile, tipuri simple, matrice, comentarii și inferențe de tip în Kotlin. În acest tutorial, vom continua să învățăm limba, analizând nullabilitatea, buclele și condițiile din Kotlin.
Dacă sunteți un coder Android, trebuie să fi întâlnit infamul NullPointerException
erori în aplicația dvs. Acestea se întâmplă de fiecare dată când încercați să apelați o metodă sau să citiți o proprietate a unei referințe de obiect care este nul
.
Vestea bună este că Kotlin ne poate ajuta să evităm acest tip de eroare deoarece este un limbaj sigur pentru null. Aceasta înseamnă că variabilele nu pot avea valoarea nulă decât dacă declarați în mod explicit că tipul lor este nul labil. Cu alte cuvinte, în mod implicit, tipurile nu pot fi nul. Să vedem cum această caracteristică a lui Kotlin ne poate ajuta să evităm erorile din codul nostru.
nume val: String = null // nu se va compila
După cum puteți vedea mai sus, dacă asignăm nul
la Nume
variabile, compilatorul se va plânge. Pentru ca compilatorul să permită atribuirea, declarați numele ca fiind nullabil adăugând ?
după tipul.
Nume val: String? = null // va compila numele = "Chike" // noua valoare este "Chike"
Rețineți că dacă ?
este introdus după orice nume de tip, am instruit în mod explicit compilatorul că valoarea tipului poate fie să stocheze o referință de obiect, fie poate fi nul
-este nullabilă. Aici, am făcut acest lucru cu Şir
tip, dar funcționează la fel cu Int?
, byte?
, Lung?
, Clasa mea?
, si asa mai departe.
?.
Să vedem mai multe despre modul în care funcționează null-safety în Kotlin cu un operator numit operator de apel în condiții de siguranță ?.
.
Nume var: String? = null print (name.length) // nu se va compila
Codul de mai sus nu se va compila deoarece Kotlin este un limbaj sigur. Variabila Nume
este atribuită valoarea nul
. Acum, invocând proprietatea lungime
pe acea variabilă ar declanșa a NullPointerException
eroare în Java. Dar compilatorul Kotlin nu va permite invocarea acestei proprietăți deoarece variabila ar putea fi nul
. Compilatorul nu ne va permite să facem ceva care ar putea genera a NullPointerException
!
val v: String? = null print (v? .length) // va compila și va imprima "null"
Acum, adăugând operatorul de apel în condiții de siguranță ?.
la variabila înainte de a invoca proprietatea, am instruit în mod explicit compilatorul să invocie proprietatea numai dacă valoarea nu este nul
. Dacă valoarea este nul
, compilatorul va folosi șirul "nul"
ca valoare pentru noi. Aceasta funcționează și pentru metode și nu doar pentru proprietăți.
Când apelați o metodă de nullabilitate, tipul returnării va fi, de asemenea, nullabil. Deci, de exemplu, tipul de retur a v? .length
expresie când v
este nullabil va fi Int?
.
val v: String? = null val: Int? = v? .length print (len) // va compila și va imprima "null"
Pentru a ignora verificarea nullabilității de către compilatorul Kotlin, putem înlocui ?.
operatorul cu !!.
. Acest lucru nu este recomandat, totuși, din cauza probabilității mari de a obține NullPointerException
dacă se utilizează erori.
val v: String? = null val: Int? = lungime print (len) // declanșează o eroare NullPointerException
?:
Acest operator ?:
este numit operatorul Elvis (deoarece forma lui arata ca capul lui Elvis). Acesta este folosit pentru a oferi o valoare alternativă pentru variabila dacă este nul
.
val username = numele null val: String = username?: "No name" imprima (nume) // va compila si imprima "No name"
Aici, compilatorul a atribuit șirul "Fara nume"
la variabila Nume
, deoarece primul nume de utilizator este valoarea nul
. Dacă prima valoare nu a fost nul
, atunci această valoare ar fi atribuită variabilei în schimb.
Kotlin are în timp, în timp, și pentru bucle.
in timp ce
BuclăO instrucțiune de repetare ne permite să specificăm că acel cod ar trebui să repete o acțiune în timp ce o anumită condiție rămâne adevărată.
Deci, în Kotlin, folosind in timp ce
buclă este aceeași ca în alte limbi, cum ar fi Java.
în timp ce (condiție) // executați codul aici în timp ce (combustibil> 5) driveMeAroundLagos ()
Atâta timp cât condiția este adevărată, codul din interiorul coastelor curbate sau al corpului bucla va fi executat. Dacă condiția este falsă, atunci codul nu va fi executat. În exemplul nostru de mai sus, odată ce variabila combustibilului devine mai mică de 5 litri, condiția devine falsă și atunci bucla se termină. Cu alte cuvinte, driveMeAroundLagos ()
executarea metodelor se oprește.
face în timp ce
BuclăKotlin are, de asemenea, face în timp ce
buclă construită.
face // executați codul aici în timp ce (condiție)
Acest lucru este similar cu in timp ce
afirmație. În bucla în timp, programul testează condiția de buclă la începutul buclei înainte de a executa corpul buclei. Dacă condiția este falsă, corpul nu este executat. Cu exceptia face în timp ce
buclă testează condiția după executarea corpului bucla. Aceasta înseamnă că corpul este executat cel puțin o dată.
pentru
BuclăA pentru
buclă este o declarație de repetiție care ne permite să iteram peste obiecte în timp ce o anumită condiție este adevărată.
pentru (valoare în interval) // Executați codul
În Kotlin, pentru
Construcția buclă funcționează cu iterație peste intervale, colecții sau alte iterabile (le voi explica mai multe despre acestea în postul următor). Pentru bucle lucrează împreună cu în
operator, care este folosit pentru a verifica dacă o valoare este prezentă într-un anumit interval.
pentru (a în 1 ... 5) print ("$ a") // va imprima 1 2 3 4 5
În codul de mai sus, iterăm printr-un interval închis de la 1 la 5 și tipărim fiecare valoare din interval.
Putem folosi withIndex ()
sau funcția indicii
proprietate pe o matrice pentru a itera peste un matrice unde avem nevoie de index pentru fiecare element.
withIndex ()
FuncţiePutem itera pe o matrice pentru a accesa indicele fiecărui element apelând withIndex ()
funcția pe matrice, deoarece withIndex ()
funcția returnează o valoare iterabilă IndexedValue
pentru fiecare element. Aceasta ne permite să accesăm atât indexul, cât și valoarea pentru fiecare element din acesta.
val numereArray = intArrayOf (1,2,3,4,5) pentru ((index, valoare) în numereArray.withIndex ()) print ("indexul indexului $ este valoarea $ \ n")
Codul de mai sus va tipări rezultatul de mai jos:
0 valoarea indexului este 1 1 valoarea indexului este 2 2 valoarea indexului este 3 3 valoarea indexului este 4 4 valoarea indexului este 5
indicii
ProprietateMai mult decât atât, putem folosi indicii
proprietate pe matrice. Aceasta va reveni doar la gama de indicatori valabili pentru matrice.
val numere1 = intArrayOf (1,2,3,4,5) pentru (index în numere1.indicate) print ("indexul indexului $ este $ numere1 [index] \ n")
Codul de mai sus va produce același rezultat ca și exemplul anterior. Puteți vedea aici și faptul că putem folosi indexul pentru a accesa un element de matrice, similar cu alte limbi de programare precum Java.
Kotlin are trei tipuri de declarații de condiție: dacă
, dacă ... altfel
, și cand
declaraţii.
dacă
AfirmațieUn dacă
instrucțiunea rulează un anumit cod dacă o condiție este adevărată sau pur și simplu ignoră dacă condiția este falsă. Nimic deosebit aici: dacă
instrucțiunile funcționează similar cu modul în care se fac în cele mai multe alte limbi de programare, inclusiv Java.
val numărul = 20 dacă (numărul% 2 == 0) print ("numărul $ este divizibil cu 2") // 20 este divizibil cu 2
De asemenea, putem verifica dacă o variabilă este de un anumit tip folosind este
cuvinte cheie.
dacă (numărul este Int) print ("numărul $ este un număr întreg")
dacă ... altfel
Afirmație dacă ... altfel
efectuează o acțiune dacă condiția este adevărată și efectuează o acțiune diferită dacă condiția este falsă.
val numărul = 13 dacă (numărul% 2 == 0) print ("numărul $ este divizibil cu 2") altceva print ("$ nu este divizibil cu 2") // 13 nu este divizibil de 2
O caracteristică majoră care distinge dacă ... altfel
declarația în Kotlin din alte limbi de programare, cum ar fi Java, este abilitatea de a atribui o variabilă din valoarea returnată a lui dacă ... altfel
afirmație. Acest lucru este posibil pentru că dacă ... altfel
declarația poate fi folosită nu doar ca o declarație, ci și ca o expresie în Kotlin.
val numărul = 13 val rezultat = dacă (numărul% 2 == 0) "numărul $ este divizibil cu 2" altceva "$ numărul nu este divizibil de 2" print
În codul de mai sus, am atribuit rezultat
variabilă cu Şir
Obiect bazat pe condiția dacă ... altfel
afirmație. Rețineți că acest lucru va returna numai ultima declarație într-un anumit bloc de condiție și de asemenea că nu puteți utiliza o dacă
fără un altfel
ca expresie.
val rezultat = dacă (număr% 2 == 0) "Divisible by 2" "Numărul este $ number" // numai acest șir este returnat dacă este executat altceva "Not divisible by 2" "Number is $ number"
cand
ExpresieKotlin a introdus cand
construi ca înlocuitor al familiei intrerupator
declarația pe care o avem în diferite limbi de programare, cum ar fi C ++, Java și așa mai departe. cand
este mai concis și are caracteristici mai puternice decât intrerupator
cu care ați putea fi familiarizați.
cand
declarația efectuează diferite acțiuni bazate pe valorile posibile ale unei constante de tip Int
, Şir
, byte
, Mic de statura
, sau orice alt obiect.
(numarul este 1) 2 -> println ("numarul este 2") 3 -> println ("numarul este 3") altceva -> println ("numărul nu este nici 1, 2 sau 3")
În codul de mai sus, am trecut funcția guessTheNumber ()
un parametru numeric (vom discuta despre funcțiile din Kotlin într-un post mai târziu). cand
expresia verifică apoi dacă oricare dintre ramuri corespunde valorii număr
și apoi execută acțiunea pe acea ramură. Dacă niciuna dintre ramuri nu a fost o potrivire, altfel
ramura este executată.
O altă variantă a cand
expresia nu necesită niciun argument, ca în exemplul de mai jos.
(numarul este 1) numarul == 2 -> println (numarul este 2) numarul == 3 -> println (numarul este 3 ") else -> println (" numărul nu este nici 1, 2 sau 3 ")
Dacă vrem să executăm mai multe acțiuni pe o ramură, trebuie să înfășurăm acțiunile în bretele curbate .
val numărul = 2 atunci când numărul 1 -> println ("numărul este 1") 2 -> // blocul executării codului println ("numărul este 2") println -> println ("numărul este 3")
Mai mult decât atât, putem combina valorile de testare într-o singură ramură.
val numărul = 2 când numărul 1, 2 -> println ("numărul este fie 1 sau 2") // numărul este fie 1 sau 2 3 -> println ("numărul este 3"
Aici, prima ramură este executată deoarece testează pentru o valoare de 1 sau 2.
În acest tutorial, ați învățat despre nullabilitatea, buclele și condițiile din limba de programare Kotlin. În următorul tutorial din seria Kotlin From Scratch, veți afla despre intervalele și colecțiile API din Kotlin. Ne vedem în curând!
Pentru a afla mai multe despre limba Kotlin, vă recomand să vizitați documentația Kotlin. Sau verificați câteva dintre celelalte tutoriale ale noastre din Kotlin aici pe Envato Tuts+!