The post Kotlin extension functions appeared first on JaroslavBeno.
]]>"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eu tempus magna.".toLowerUpper();
Takáto metóda v string neexistuje a máme chybu. Nemáme prístup k zdrojovým kódom string aby sme si to tam doplnili. No môžeme použiť fintu a tou sú exension functions.
Ćo potrebujeme spraviť je napísať funkciu, ktorá nám spraví to čo požadujeme:
Teraz napíšeme algoritmus:
fun toLowerUpper(text: String): String{
val finalString = StringBuilder()
for (i in 0 until text.length) {
if (i % 2 == 0) {
finalString.append(text.toLowerCase()[i])
} else {
finalString.append(text.toUpperCase()[i])
}
}
return finalString.toString()
}
Takto je to normálna hodnota, ale ak chcem aby sa táto metóda dala používať priamo pri Stringu, tak pre názov metódy napíšeme typ a bodku teda String.:
fun String.toLowerUpper(): String{
val finalString = StringBuilder()
for (i in 0 until this.length) {
if (i % 2 == 0) {
finalString.append(this.toLowerCase()[i])
} else {
finalString.append(this.toUpperCase()[i])
}
}
return finalString.toString()
}
Teraz nepotrebujeme parameter funkcie s názvom text. Zmažeme ho a k hodnote nad ktorou voláme metódu sa dostaneme pomocou this.:
fun String.toLowerUpper(): String{
val finalString = StringBuilder()
for (i in 0 until this.length) {
if (i % 2 == 0) {
finalString.append(this.toLowerCase()[i])
} else {
finalString.append(this.toUpperCase()[i])
}
}
return finalString.toString()
}
A zrazu metóda ToLowerUper funguje aj takto:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eu tempus magna.".toLowerUpper();
Dôležité je zapamätať si, že naše extension funkcie musia byť v tom istom projekte ako kód kde ich používame.
The post Kotlin extension functions appeared first on JaroslavBeno.
]]>The post Kotlin funkcie appeared first on JaroslavBeno.
]]>Začíname so slovom fun. Potom ide názov a nasledujú argumenty. Ak metóda nič nevracia, tak na pozadí vracia typ Unit.
Ak metóda vracia nejakú hodnotu, tak typ návratovej hodnoty zapíšeme za argumenty za dvojbodku. Ak metóda má návratovú hodnotu inú ako Unit, tak v metód musí byť príkaz return.
fun nazovMetody(argument1: Int, argument2: String): String{
return ""
}
Následne vieme túto metódu zavolať, tak, že dáme názvov metódy, zátvorky a hodnoty pre parametre ak metóda požaduje parametre.
nazovMetody(1, "")
Výsledok metódy vieme zapísať do premennej.
val vysledokVolaniaMetody = nazovMetody(1, "")
Ak funkcia obsahuje len jeden riadok. Napríklad:
fun nazovMetody(argument1: Int, argument2: String): String{
return "$argument1 a $argument2"
}
Tak vieme zápis zjednodušiť tým, že zmažeme zložené zátvorky, zmažeme return a za návratový typ dáme rovná sa :
fun nazovMetody(argument1: Int, argument2: String): String =
"$argument1 a $argument2"
Ak je len jeden riadok, tak kompilátor z neho vie určiť návratový typ, teda aj ten môžeme vymazať:
fun nazovMetody(argument1: Int, argument2: String) = "$argument1 a $argument2"
To isté je možné aj pre funkcie, ktoré nič nevracajú:
fun nicNevraciam() = println("funkcia kde nic nevraciam")
Parametrom vieme pripísať default hodnoty. Tým vieme zavolať funkcie aj bez zadanie parametrov, ktoré majú default hodnotu:
fun nazovMetody(argument1: Int, argument2: String = "Jaro")
= "$argument1 a $argument2"
nazovMetody(10, "Fero") nazovMetody(10)
Ak chceš kľudne vieš zmeniť poradie parametrov pri volaní metódy ak zadáš ich názov:
nazovMetody(argument2 = "Evka", argument1 = 15)
Tento štýl sa nazýva named arguments. Teda pomenované argumenty. Ak použijeme tento štýl, tak musíme vždy uviesť všetky argumenty s názvom.
Ak tvoja metóda pracuje s údajmi, ktoré sú toho istého typu a chceš s nimi pracovať podobne v metóde, tak vieš ako argument použiť takzvané vararg. Čo je v podstate skratka pre napísanie zoznamu.
Majme metódu, ktorú chceš použiť na vypísanie mien na konzolu. Najprv chcem vypísať 3 mená, neskôr 5 mien a dané mená chcem vložiť ako parametre funkcie. S použitím varags je to jednoducho takto:
fun printMena(vararg mena: String){
for(m in mena){
println(m)
}
}
Metódu zavoláme nasledovne:
printMena("Jaro", "Fero", "Evka", "Palko");
printMena("Evka", "Palko");
printMena("Palko"); printMena();
Teda vstupom metódy je 0 a viac Stringov.
Ak používame vararg, tak môžeme používať aj iný parameter. Ale pri volaní metódy musíme tento parameter pomenovať:
fun printMena(vararg mena: String, text: String) … printMena("Jaro", "Fero", "Duro", text = "text iny");
printMena("Evka", "Palko", text = "text iny");
printMena(text = "text iny");
printMena(); //chyba neuviedol som text
V prípade ak by vararg bol ako posledný parameter a pred vararg by niečo bolo:
fun printMena(text: String, vararg mena: String){
Tak vieme túto metódu zavolať bez named parametru, ale prvý String sa bude považovať, že je text. Teda v tomto príklade by sa za mena považovali len Fero a Duro a Jaro sa bude považovať za text:
printMena("Jaro", "Fero", "Duro");
Ak by si vytvoril pole pomocou arrayOf, tak ako parameter tejto metódy je tiež vararg.
Ak máme metódu, ktorá očakáva vararg, tak v Jave sme do nej vedeli vložiť array. Tu v kotline to nie je možné. Čo musíme spraviť je rozbaliť array na jednotlivé časti – spravíme to tak, že pred parameter, ktorý obsahuje array dáme hviezdičku *.
fun printMena(vararg mena: String){ .. val mena = arrayOf("Jaro", "Fero", "Duro")
printMena(mena); //chyba
printMena(*mena); //ok
The post Kotlin funkcie appeared first on JaroslavBeno.
]]>The post Kotlin Data class appeared first on JaroslavBeno.
]]>Máme triedu Auto:
class Auto (val nazov: String, val pocetDveri: Int = 4) {
}
Ako z nej spravím data class? Jednoducho pred slovo class pridáme data:
data class Auto (val nazov: String, val pocetDveri: Int = 4) {
}
Čo sa zmenilo? Kotlin nám na pozadí poskytol ďalšiu funkcionalitu. Spraví špeciálnu implementáciu funkcií ako toString alebo equals. Ak sa nám nepáčia, stále ich vieme ovverridnúť a napísať sami.
Konštruktor v data class musí obsahovať len property, nemôžeme odstrániť val alebo var.
Ak sa pokúsim vypísať na konzolu instanciu:
val skoda = Auto("Skoda", 5)
print(skoda)
Tak na výpise bude pekný text:
Auto(nazov=Skoda, pocetDveri=5)
Ak sa pokúsim vypísať instanciu nie data classy:
val osoba = Osoba("Jaro", "151515/1616")
println(osoba)
Tak na výpise už nebude taký pekný text:
sk.jaroslavbeno.kotlin.Osoba@506e1b77
Podobne to bude aj pri porovnávaní. Povedali sme si, že existuje takzv štrukturálne porovnávanie, kde sme museli napísať vlastnú equals funkciu na porovnanie rodných čísel a až vtedy sa nám dva objekty rovnali. Majme teraz jednoduchú triedu osoba:
class Osoba(var meno: String, val rodCislo: String) {
}
A štrukturálne porovnajme dve instancie – dva objekty typu Osoba s rovnakým menom a rovnakým rodným číslom:
val osoba = Osoba("Jaro", "151515/1616")
val osoba2 = Osoba("Jaro", "151515/1616")
println(osoba == osoba2)
Na výpise bude false.
Ak to isté spravím z data class – porovnám dva objekty, bez toho aby som zašpecifikoval vlastnú equals metódu:
val skoda = Auto("Skoda", 5)
val skoda2 = Auto("Skoda", 5)
println(skoda == skoda2)
Tak na výpise bude true. V data classoch sa porovnajú štruktúry – property na pozadí. Ak chceme tak vieme prepísať equals funkciu ako sme to robili pri Osobe.
Ďalšou pomocnou funkciou je copy. Táto funkcia nám spraví to, že vytvorí nový objekt, na základe starého objektu – prekopíruje jeho štruktúru.
val skoda3 = skoda.copy()
Štrukturálne budú objekty rovnaké ale budú mať inú referenciu:
println(skoda == skoda3) //true println(skoda === skoda3) //false
Copy funkcia nám dovoľuje zašpecifikovať, ktoré property chceme nastaviť inak ako sú v pôvodnom objekte. Napr. počet dverí bude iný:
val skoda4 = skoda.copy(pocetDveri = 4)
Postupne čiarkou a nastavením property vieš nastaviť aj iné property.
The post Kotlin Data class appeared first on JaroslavBeno.
]]>The post Kotlin triedy a konštruktory appeared first on JaroslavBeno.
]]>Čo má auto? Aké vlastnosti? Má počet dverí, značku, ečv, objem kufra a ďalších xy vecí. Nie všetky budeme používať.
Vytvorme si triedu Auto.
class Auto {
}
Na základe tejto triedy si vytvoríme nový objekt typu Auto.
val auticko = Auto()
Na výrobu objektov budeme používať konštruktor. Konštruktor ako názov naznačuje slúži na skonštruovanie nového objektu.
Bez toho aby si ty sám napísal nejaký konštruktor, tak máš jeden dostupný automaticky. Tento sa volá – bezparametrický konštruktor – je to akoby metóda, ktorá na vstupe nemá parametre. Preto je možné vyrobiť nový objekt pomocou Auto()
Vytvorme si ale konštruktor, ktorý vytvorí Auto s názvom. Vedľa názvu triedy napíšeme constructor zátvorky a do zátvoriek dáme premennú a typ.
class Auto constructor(nazov: String) {
}
Teraz vieme zavolať vytvorenie auta pomocou nového konštruktoru:
val auticko = Auto("Skoda")
Všimni si, že pôvodný bez parametrický konštruktor nemáme dostupný. Teraz nedokážem vytvoriť nové auto pomocou Autu(), pretože tento konštruktor bol doplnený len ak som nezadal žiaden iný konštruktor. Ak ale predsa len chceme bez parametrický konštruktor musíme ho doplniť.
Teraz sme do zavolania konštruktoru poslali String Skoda. Kde sa ale tento String uloží? To musíme špecifikovať.
Tu je rozdiel od vytvorenie Osoby, ako sme to robili pred tým. Vytvoríme si teda premennú v triede s názvom a typom. Táto premenná je globálna v triede. Je dostupná všetkým metódam v danej triede. Ale ak je globálna musí mať hodnotu, lebo hocikde v nejakej metóde k nej môžeme pristúpiť.
class Auto constructor(nazov: String) {
val nazov: String
}
Akú hodnotu tam chcem dať? Tú hodnotu, ktorá prišla do konštruktoru. Túto hodnotu viem využiť v bloku kódu init.
class Auto constructor(nazov: String) {
val nazov: String
init {
this.nazov = nazov
}
}
Takto napísaný konštruktor mimo kučeravých zátvoriek triedy sa nazýva privátny konštruktor. K tomu si niečo ešte povieme.
Ak používame primárny konštruktor a chceme využiť nazov, ktorý mi prišiel do konštoru, tak na to využijmee init blok, ktorý sa volá iba raz pri vytvorení objektu.
Tu vo vnútri sa cez príkaz this odvolávame na tento novo vytvorený objekt a tomuto novému objektu nastavujem nazov hodnotou, ktorú som poslal do konštruktoru pod názvom nazov.
Ak by sa premenná v konštruktore volal inak, tak nemusím volať this.
class Auto constructor(nazov2: String) {
val nazov: String
init {
nazov = nazov2
}
}
Tento spôsob je zdĺhavý a pracuje podobne ako v jave.
Kratší spôsob je odstránenie init bloku a pridanie hodnoty priamo z konštruktoru do globálnej premennej.
class Auto constructor(nazov2: String) {
val nazov: String = nazov2
}
Načo je konštruktor – na presunutie hodnoty do globálnej premennej. Stále opakujem toto jednoduché. Preto to v Kotline vieme ešte viac uľahčiť.
Zmažeme globálnu premennú (property) a do konštruktoru pridáme pre nazov2 val a meno zmeníme na nazov. Teraz Kotlin na pozadí vytvorí property a nastaví mu hodnotu, nám stačí napísať:
class Auto constructor(val nazov: String) {
}
Teraz to vieme ešte viac zjednodušiť, tým, že odstránime slovo constructor:
class Auto (val nazov: String) {
}
Týmto spôsobom sme vytvorili jeden primárny konštruktor.
Často sa ale stáva, že chceme objekt vytvoriť a podstrčiť mu rôzne premenné, napríklad názov a počet dverí. Vieme vytvoriť ďalší konštruktor:
class Auto (val nazov: String) {
constructor(nazov: String, pocetDveri: Int){
}
}
Tento konštruktor požaduje, aby sa zavolal primárny konštruktor, ak sme ho zadefinovali. Tento primárny konštruktor zavoláme ak za zátvorkou dáme dvojbodku a napíšeme this(nazov). Čo sa stalo? This sa odvolá na konštruktor, ktorý má presne jeden String parameter. Zavolá sa primárny konštrukor a posunie sa do neho premenná nazov z tohto sekundárneho konštruktoru.
class Auto (val nazov: String) {
constructor(nazov: String, pocetDveri: Int) : this(nazov){
}
}
Tu si treba zapamätať, že sekundárne konštruktory nám na pozadí nenastavia hodnoty na globálne premenné. Teda nazov sa posunie do primárneho konštruktoru a tam sa nastaví na property nazov a môžem urobiť nad objektom auto.nazov. Ale pocetDveri sa neposúva do primárneho konštruktoru a teda pocetDveri nie je dostupný ako auto.pocetDveri.
Musíme vytvoriť vlastnú property v triede (globálnu premennú).
class Auto (val nazov: String) {
val pocetDveri: Int
constructor(val nazov: String, val pocetDveri: Int){
}
}
PocetDveri nesmie byť ne-inicializovaný – musíme mu pridať hodnotu a to spravíme pomocou pridania hodnoty na priamo alebo v init bloku.
class Auto (val nazov: String) {
var pocetDveri: Int = 4
constructor(nazov: String, pocetDveri: Int) : this(nazov){
}
}
Ak hodnota príde v sekundárnom konštruktore, tak ju nastavíme na property:
class Auto (val nazov: String) {
var pocetDveri: Int = 4
constructor(nazov: String, pocetDveri: Int) : this(nazov){
this.pocetDveri = pocetDveri
}
}
Teraz vieme auto vytvoriť pomocou oboch konštruktorov.
val auticko = Auto("Skoda")
val skoda = Auto("Skoda", 5)
println(skoda.nazov)
println(skoda.pocetDveri)
Je možné dosiahnúť to, aby som vytvoril objekt dvomi spôsobmi bez toho aby som musel napísať nový sekundárny konštruktor. Teda môžem spraviť toto pomocou jedného konštruktoru?:
val auticko = Auto("Skoda")
val skoda = Auto("Skoda", 5)
Odpoveď je áno a to tak, že všetky property napíšeme v primárnom konštruktore ale hodnotám, ktoré sa nemusia vždy vyplniť dáme default hodnotu.
Triedu Auto prerobíme takto:
class Auto (val nazov: String, val pocetDveri: Int = 4) {
}
Aj sekundárne konštruktory môžu obsahovať default hodnoty.
Ak v triede neexistuje primárny konštruktor, tak môžeme vytvoriť sekundárny konštruktor a nemusíme pomocou dvojbodky volať nič.
class Skuska{
val daco: Int;
constructor(){
this.daco = 4;
}
}
IDEA nám dáva ponuku prerobiť to na primárny konštruktor:
class Skuska() {
val daco: Int;
init {
this.daco = 4
}
}
The post Kotlin triedy a konštruktory appeared first on JaroslavBeno.
]]>The post Kotlin range appeared first on JaroslavBeno.
]]>Použitie v podmienke:
if (i in 1..4) { // equivalent of 1 <= i && i <= 4 print(i) }
Prechádzanie cez hodnoty rangu:
for (i in 1..4) print(i)
Prechádzanie v opačnom poradí od 4 po 1:
for (i in 4 downTo 1) print(i)
Prechádzam cez rozpätie a po prvom preskočím dva elementy z rozpätia:
for (i in 1..8 step 2)
print(i)//výpis: 1357
Od 1 do 9 (až po 10):
for (i in 1 until 10) { print(i) }
V opačnom poradí preskakujem 2:
for (i in 8 downTo 1 step 2)
print(i)
//8642
The post Kotlin range appeared first on JaroslavBeno.
]]>The post Kotlin dátové typy appeared first on JaroslavBeno.
]]>Teda ak by sme zavolali Java metódu a tá by nám vrátila int, tak na strane Kotlin sa nič nemení. Použije sa Boxing a z int sa stane Int.
Majme jednoduchú Java triedu a metódu:
public class JavaKod {
static public int sum(int a, int b){
return a+b;
}
}
Túto metódu zavoláme z Kotlinu:
val vysledok = JavaKod.sum(10,5)
Všetko funguje tak ako má v v premennej vysledok bude číslo typu Int.
val vysledok: Int = JavaKod.sum(10,5)
Každá Kotlin trieda má predchodcu – rodiča – superclass – od ktorého dedí a tým je Any trieda a z tejto triedy sa dedia metódy ako napr. toString a equels.
Typ Unit sa používa namiesto void v Jave. V podstate to znamená, že nič. Napríklad v použití pri funkcii kde chcem vrátiť nič, viem zašpecifikovať, že vracia Unit. Teda rozdiel medzi Javou a Kotlin je aj v tom, že v Kotline sa vždy niečo vracia – ak funkciu napíšeme tak, že nemá return, ale aj tak jej výsledok chcem priradiť do premennej, tak sa do premennej priradí typ Unit.
fun nic(){
print("nic nevraciam")
}

Ak dám vypísať premennú:
println(vysledokNic)
Na výpise bude
kotlin.Unit
The post Kotlin dátové typy appeared first on JaroslavBeno.
]]>The post Kotlin String templates appeared first on JaroslavBeno.
]]>for((i, v) in mena.withIndex()){
print("" + i + " " + v + "\n")
}
Kotlin ale má krajšiu cestu:
for((i, v) in mena.withIndex()){
print("$i $v\n")
}
Kde jednoducho napíšeme úvodzovky, čo nám značí, že píšeme String a tam kde chcem dať premennú, tak napíšem názov premennej a pred ňu dám znak dolár.
Ak chceš vypísať do textu dolár a nebrať ho ako špeciálnu značku, tak ho musím takzvane escapnúť. Pred znak dolár dám spätné lomítko \.
print("$i $v s $znakom") //chyba
print("$i $v s \$znakom") //dobre
Za znak dolár môžeme dať aj výraz do zložených zátvoriek, ktorý vráti hodnotu.
println("Spocitam 4 + 2 je ${4 + 2}")
Alebo tu zavolám metódu, alebo niečo podobné, čo vráti hodnotu. Podobne aj keď pristupujem k hodnotám v objektu. napr osoba.meno musí byť tiež v zložených zátvorkách.
The post Kotlin String templates appeared first on JaroslavBeno.
]]>The post Kotlin for cyklus appeared first on JaroslavBeno.
]]>Predstav si, že chceš vypísať čísla od 0 do 10.
Použijeme for cyklus kde ako prvé bude názov pomocnej premennej, ktorá si bude držať hodnotu aktuálneho elementu cez ktorý prechádzam, teda ak idem od 0 do 10, tak si postupne bude pamätať, že má 0, potom 1, potom 2 ….
Druhá časť for príkazu je slovo in – za in nasleduje niečo cez čo prechádzam pomocou for — teraz je to range – nejaký rozsah. chceme od 1 do 10, tak napíšem 1..10
for (i in 1..10){
println(i)
}
Premenná, ktorú som teraz pomenoval ako i je dostupná v celom bloku for cyklu – blok rozumej všetko medzi kučeravými zátvorkami.
Ak zadám 10..15, tak sa vypíšu všetky čísla od 11 do 15 (vrátane).
Premenné, ktoré zadáš mimo for cyklu môžeš samozrejme používať vo vnútri cyklu.
Mám zoznam elementov
val mena = arrayListOf("Jaro", "Peter");
Teraz chcem prechádzať všetky elementy. Čo spravím? Použijem for cyklus kde ako prvé bude názov novej premennej kde budem postupne ukladať zaradom elementy z listu a tá premenná bude dostupná v cykle. A potom zašpecifikuje in kde dám daný zoznam.
val mena = arrayListOf("Jaro", "Peter");
for(meno in mena){
println(meno)
}
Môže sa ti stať, že chceš vo vnútri cyklu prístup nie len k hodnote, ale aj k indexu. Na tento účel budeš prechádzať in mena.widthIndex(). Tento spôsob nám predstaví dve premenné kde prvá bude int kde bude index a druhá premenná bude mať hodnotu.
for((i, v) in mena.withIndex()){
print("" + i + " " + v + "\n")
}
The post Kotlin for cyklus appeared first on JaroslavBeno.
]]>The post Kotlin polia appeared first on JaroslavBeno.
]]>val mena = arrayOf("Jaro", "Peter");
val rozne = arrayOf("Jaro", 10, Osoba("Tomas", "145878/8787"), false, "Peter");
Aj miešame typy elementov, tak tento array rozne bude nakoniec typu Array
Ak chceme zašpecifikovať napríklad int, double, float array môžeme:
javaval intCisla = intArrayOf(10,10) val doubleCisla = doubleArrayOf(10.0,10.1) val floatCisla = floatArrayOf(15.0f, 45.0f)
Každý prvok poľa má index. Index slúži na presné identifikovanie prvku v poli. V poliach začíname prvky – teda indexi počítať od 0.
Ak mám pole dĺžky 10, tak má tieto indexi: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
Prvý element (prvok) má index 0.
Ak hovorím o elementoch – prvkoch, tak mám na mysli hodnotu, ktorá je uchovaná v poli na danom indexe.

Polia majú pevne definovanú dĺžku pri inicializácii. Pole nevieme inak rozšíriť. Ak som vytvoril pole s 5 elementami, tak navždy tam bude 5 „priečinkov“ na uloženie dát.
val mena = arrayOf("Jaro", "Peter");
println(mena[0]) //vypíše Jaro
println(mena[1]) //vypíše Peter
println(mena[2]) //nastane chyba, taký index v poli nie je
Ak chcem zmeniť hodnotu na danom indexe môžem.
mena[1] = "Ferko" println(mena[1]) //vypíše Ferko
Napríklad aj String je vlastne pole znakov. Teda je možné napríklad toto:
val jarko = "Jarko" println(jarko[0]) //vypíše J
Čo ak chcem spojiť dva polia dokopy? Môžem za pomoci +, ale polia musia mať elementy rovnakého typu.
val mena = arrayOf("Jaro", "Peter");
val mena2 = arrayOf("Ferko", "Evka");
val spoluMena = mena + mena2
Pri poliach máme veľké množstvo pomocných funkcií a premenných ako je napríklad získanie veľkosti poľa spoluMena.size.

Chceš zistiť, či je zoznam prázdny? Použiješ isEmpty

Obsahuje pole element? Použiješ contains().
Do metódy arrayOf vieme podsunúť akého typu má byť, ak za metódu napíšeme typ medzi znaky <>.
val longArray = arrayOf(10L, 15L) val longArray2 = arrayOf(10,15)
Ak všetko v Kotlin je objekt, tak aj pole a to presne Array trieda. Teda môžeme použiť Array na zostrojenie poľa.
Chceme zostrojiť Array Intov o dĺžke 10 elementov a zároveň naplniť toto pole pomocou lambda výrazu? Lambda výraz je špeciálny typ funkcie.
val pole = Array(10){ i -> i} for(j in pole){ println(j) }
Čo sa stalo? Vytvoril som nový Array Intov o dĺžke 10: Array
Ak by som chcel len párne čísla, tak viem napísať napr. toto:
val pole = Array(10){ i -> i*2 } for(j in pole){ println(j) }
Vo výsledku bude na výpise:
| 0 2 4 6 8 10 12 14 16 18 |
Daným príkazom – lambda výrazom – vravím, akú hodnotu chceme priradiť na daný index. Kľudne nemusíme daný index používať.
Ak chcem pole mien, naplnených tým istým menom:
val menaArray = Array(10){ i -> "Jaro"}
for(m in menaArray){
println(m)
}
Na výpise bude 10x meno Jaro.
Je možné vytvoriť prázdne pole, ktoré bude očakávať napríklad Int.
val nullIntPole = arrayOfNulls(5)
Vytvorilo sa pole o dĺžke 5 a všade bude null, lebo som povedal, že chcem nullable Int. Ak ale chcem použiť nejakú metódu špecifickú pre Int, tak som obmedzený a nemôžem použiť Int funkcie, lebo kompilátor vie, že je to nullable a teda tam môže byť aj null. Použijeme safe call:
nullIntPole[0].toBigDecimal() //nie je možné nullIntPole[0]?.toBigDecimal() //je možné
The post Kotlin polia appeared first on JaroslavBeno.
]]>The post Kotlin when appeared first on JaroslavBeno.
]]>Mohol by som to písať pomocou if else if else a tak ďalej, ale v takomto prípade je lepšie použiť when. Teda when použi všade tam kde by si písal viacej if else príkazov pod sebou.
Napíšeme príkaz when a zátvorky, do zátvoriek pošleme premennú, ktorá sa bude meniť – niekedy tam príde SEVER, niekedy JUH a podobne. Ďalej dáme kučeravé zátvorky, kde napíšeme, čo sa má diať:
val smer = "SEVER";
when(smer){
"SEVER" -> println("Idem na sever bude zima.")
"JUH" -> {
println("Idem na JUH")
println("Beriem plavky")
}
}
Teraz keď spustím program tak v smer je SEVER a vo when sa spustí kód za šípkou vedľa SEVER. Ak by som zmenil smer na JUH, tak sa spustí kód za šípkou vedľa JUH. Ak by sme bol napríklad VYCHOD, tak sa nestane nič, lebo som to nešpecifikoval vo when.
Ak v smer bude niečo iné ako mám možnosti vo when, tak môžem na to reagovať. Teda ak som nič nenašiel vo when, môžem dopísať else.
when(smer){
"SEVER" -> println("Idem na sever bude zima.")
"JUH" -> {
println("Idem na JUH")
println("Beriem plavky")
}
else -> println("Zadal si smer, ktorý nepoznám")
}
Vo when bloku vieme na ľavú stranu šípky vložiť hocijaký príkaz, ktorý vráti hodnotu. Napríklad 2*5, alebo zavoláme funkciu. Logicky tam ale musí vzniknúť taký typ, ako je typ premennej, nad ktorou sa rozhodujeme – v tomto prípade smer a to je String.
fun main(args: Array) { val smer = "SEVER"; when(smer){ "SEVER" -> println("Idem na sever bude zima.") ""+10*5 -> println("jaro") davajString() -> println("vysledok davaj string") else -> println("Zadal si smer, ktorý nepoznám") } } fun davajString(): String { return "Jaro" }
Môžeme používať aj range, o ktorých sa budeme rozprávať neskôr (v inom článku) a ktoré sa používajú napríklad aj vo for cykle.
Napr. ak je číslo medzi 5 a 10 (5..10), tak vojdem do tej vetvi kde bude in 5..10 – čo ak to chcem preložiť do slovenčiny> ak je číslo v rozmedzí 5 až 10 tak vojdi do tejto vetvi.
val cislo =6
when(cislo){
1 -> println("je to cislo 1")
in 5..10 -> println("je to cislo medzi 5 az 10")
}
The post Kotlin when appeared first on JaroslavBeno.
]]>