Kotlin | JaroslavBeno http://jaroslavbeno.sk Programovanie, kurzy, články, tipy, triky a mnoho iného. Thu, 28 May 2020 03:00:01 +0000 en-US hourly 1 https://wordpress.org/?v=5.4.1 http://jaroslavbeno.sk/wp-content/uploads/2020/03/cropped-JB3-32x32.png Kotlin | JaroslavBeno http://jaroslavbeno.sk 32 32 Kotlin extension functions http://jaroslavbeno.sk/kotlin-extension-functions/?utm_source=rss&utm_medium=rss&utm_campaign=kotlin-extension-functions http://jaroslavbeno.sk/kotlin-extension-functions/#respond Thu, 28 May 2020 02:46:39 +0000 http://jaroslavbeno.sk/?p=634 Predstav si, že chceš manipulovať so stringom. Máš text, ktorý chceš upraviť, napríklad každé druhé písmeno chceš dať veľkým písmenom. Každé prvé bude malým. Máš takúto metódu v Stringu? Nie. Teda nie je možné zavolať napríklad: 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ť […]

The post Kotlin extension functions appeared first on JaroslavBeno.

]]>
Predstav si, že chceš manipulovať so stringom. Máš text, ktorý chceš upraviť, napríklad každé druhé písmeno chceš dať veľkým písmenom. Každé prvé bude malým. Máš takúto metódu v Stringu? Nie. Teda nie je možné zavolať napríklad:

"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.

Najnovšie články

The post Kotlin extension functions appeared first on JaroslavBeno.

]]>
http://jaroslavbeno.sk/kotlin-extension-functions/feed/ 0
Kotlin funkcie http://jaroslavbeno.sk/kotlin-funkcie/?utm_source=rss&utm_medium=rss&utm_campaign=kotlin-funkcie http://jaroslavbeno.sk/kotlin-funkcie/#respond Tue, 26 May 2020 10:06:49 +0000 http://jaroslavbeno.sk/?p=632 Ak je funkcia vo vnútri triedy, tak sa označuje ako metóda alebo member funkcia – ale je to v podstate jedno. 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 […]

The post Kotlin funkcie appeared first on JaroslavBeno.

]]>
Ak je funkcia vo vnútri triedy, tak sa označuje ako metóda alebo member funkcia – ale je to v podstate jedno.

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.

]]>
http://jaroslavbeno.sk/kotlin-funkcie/feed/ 0
Kotlin Data class http://jaroslavbeno.sk/kotlin-data-class/?utm_source=rss&utm_medium=rss&utm_campaign=kotlin-data-class http://jaroslavbeno.sk/kotlin-data-class/#respond Tue, 26 May 2020 09:59:14 +0000 http://jaroslavbeno.sk/?p=629 Ak potrebuješ uchovávať stav aplikácie. Teda máš premenné a potrebuješ ich nastavovať a získavať ich hodnoty, tak vieš použiť Data class. Máme triedu Auto: Ako z nej spravím data class? Jednoducho pred slovo class pridáme data: Č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, […]

The post Kotlin Data class appeared first on JaroslavBeno.

]]>
Ak potrebuješ uchovávať stav aplikácie. Teda máš premenné a potrebuješ ich nastavovať a získavať ich hodnoty, tak vieš použiť Data class.

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.

]]>
http://jaroslavbeno.sk/kotlin-data-class/feed/ 0
Kotlin triedy a konštruktory http://jaroslavbeno.sk/kotlin-triedy-a-konstruktory/?utm_source=rss&utm_medium=rss&utm_campaign=kotlin-triedy-a-konstruktory http://jaroslavbeno.sk/kotlin-triedy-a-konstruktory/#respond Sat, 23 May 2020 16:17:13 +0000 http://jaroslavbeno.sk/?p=612 Trieda slúži na opis a výrobu objektov. Skúsme porozmýšľať nad reálnym objektom – napríklad auto. Ak chceme opísať auto do programu, tak na opis auta použijeme triedu. Č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. Na základe tejto triedy si vytvoríme […]

The post Kotlin triedy a konštruktory appeared first on JaroslavBeno.

]]>
Trieda slúži na opis a výrobu objektov. Skúsme porozmýšľať nad reálnym objektom – napríklad auto. Ak chceme opísať auto do programu, tak na opis auta použijeme triedu.

Č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
    }
}

Najnovšie články

The post Kotlin triedy a konštruktory appeared first on JaroslavBeno.

]]>
http://jaroslavbeno.sk/kotlin-triedy-a-konstruktory/feed/ 0
Kotlin range http://jaroslavbeno.sk/kotlin-range/?utm_source=rss&utm_medium=rss&utm_campaign=kotlin-range http://jaroslavbeno.sk/kotlin-range/#respond Sat, 23 May 2020 14:29:48 +0000 http://jaroslavbeno.sk/?p=610 Range ako názov hovorí je rozpätie hodnôt. V tomto článku sa pozrieme na to ako Kotlin pracuje s range. Poďme sa pozrieť na príklady. Použitie v podmienke: Prechádzanie cez hodnoty rangu: Prechádzanie v opačnom poradí od 4 po 1: Prechádzam cez rozpätie a po prvom preskočím dva elementy z rozpätia: Od 1 do 9 (až po 10): V opačnom poradí […]

The post Kotlin range appeared first on JaroslavBeno.

]]>
Range ako názov hovorí je rozpätie hodnôt. V tomto článku sa pozrieme na to ako Kotlin pracuje s range. Poďme sa pozrieť na príklady.

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

Najnovšie články

The post Kotlin range appeared first on JaroslavBeno.

]]>
http://jaroslavbeno.sk/kotlin-range/feed/ 0
Kotlin dátové typy http://jaroslavbeno.sk/kotlin-datove-typy/?utm_source=rss&utm_medium=rss&utm_campaign=kotlin-datove-typy http://jaroslavbeno.sk/kotlin-datove-typy/#respond Sat, 23 May 2020 13:19:03 +0000 http://jaroslavbeno.sk/?p=606 Java a Kotlin sú zameniteľné jazyky. Vieš ich obidva použiť v jednom programe, pretože nakoniec z nich bude .class súbor. Tým pádom typy, ktoré pozná Kotlin, pozná aj Java. Sú rozdiely, ktoré už vieš. Nevieš napísať typ int, ale vieš ho používať v type Int. Teda ak by sme zavolali Java metódu a tá by nám vrátila int, tak na […]

The post Kotlin dátové typy appeared first on JaroslavBeno.

]]>
Java a Kotlin sú zameniteľné jazyky. Vieš ich obidva použiť v jednom programe, pretože nakoniec z nich bude .class súbor. Tým pádom typy, ktoré pozná Kotlin, pozná aj Java. Sú rozdiely, ktoré už vieš. Nevieš napísať typ int, ale vieš ho používať v type Int.

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")
}
idea kotlin 20

Ak dám vypísať premennú:

println(vysledokNic)

Na výpise bude

kotlin.Unit

Najnovšie články

The post Kotlin dátové typy appeared first on JaroslavBeno.

]]>
http://jaroslavbeno.sk/kotlin-datove-typy/feed/ 0
Kotlin String templates http://jaroslavbeno.sk/kotlin-string-templates/?utm_source=rss&utm_medium=rss&utm_campaign=kotlin-string-templates http://jaroslavbeno.sk/kotlin-string-templates/#respond Sat, 23 May 2020 13:08:20 +0000 http://jaroslavbeno.sk/?p=602 Pri vypisovaní textu často ku textu pridávame hodnoty z premenných. Spájanie Stringov vieme spraviť pomocou + kde pospájame hodnoty a Stringy: Kotlin ale má krajšiu cestu: 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 […]

The post Kotlin String templates appeared first on JaroslavBeno.

]]>
Pri vypisovaní textu často ku textu pridávame hodnoty z premenných. Spájanie Stringov vieme spraviť pomocou + kde pospájame hodnoty a Stringy:

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.

Najnovšie články:

The post Kotlin String templates appeared first on JaroslavBeno.

]]>
http://jaroslavbeno.sk/kotlin-string-templates/feed/ 0
Kotlin for cyklus http://jaroslavbeno.sk/kotlin-for-cyklus/?utm_source=rss&utm_medium=rss&utm_campaign=kotlin-for-cyklus http://jaroslavbeno.sk/kotlin-for-cyklus/#respond Sat, 23 May 2020 12:27:46 +0000 http://jaroslavbeno.sk/?p=597 Cyklus alebo loop znamená, že niečo sa opakuje xy krát. Možno prechádzame čísla od 1 do 100, alebo prechádzame cez elementy v poli alebo liste. V tomto článku sa dozvieš ako použiť for cyklus. 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 […]

The post Kotlin for cyklus appeared first on JaroslavBeno.

]]>
Cyklus alebo loop znamená, že niečo sa opakuje xy krát. Možno prechádzame čísla od 1 do 100, alebo prechádzame cez elementy v poli alebo liste. V tomto článku sa dozvieš ako použiť for cyklus.

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")
}  

Najnovšie články

The post Kotlin for cyklus appeared first on JaroslavBeno.

]]>
http://jaroslavbeno.sk/kotlin-for-cyklus/feed/ 0
Kotlin polia http://jaroslavbeno.sk/kotlin-polia/?utm_source=rss&utm_medium=rss&utm_campaign=kotlin-polia http://jaroslavbeno.sk/kotlin-polia/#respond Fri, 22 May 2020 06:18:30 +0000 http://jaroslavbeno.sk/?p=587 Pole je zoskupenie jeden a viac prvkov. Na vytvorenie poľa použijeme funkciu arrayOf. Do pola môžeme dať hodnoty rôzneho typu. 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: Každý prvok poľa má index. Index slúži na presné identifikovanie prvku v poli. V poliach začíname prvky […]

The post Kotlin polia appeared first on JaroslavBeno.

]]>
Pole je zoskupenie jeden a viac prvkov. Na vytvorenie poľa použijeme funkciu arrayOf. Do pola môžeme dať hodnoty rôzneho typu.

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.

idea kotlin 17

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.

idea kotlin 18

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

idea kotlin 19

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)

Advance array

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(10) a medzi kučeravé zátvorky som napísal aký príkaz sa má vykonať i -> i. Tu som povedal, že budem mať premennú i – tá bude typu int a bude tam index a i sa posunie do kódu za šípkou kde mám teraz len i a tak sa i priradí do pola na index i. V tomto prípade sa index počíta od 0.

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é  

Najnovšie články

The post Kotlin polia appeared first on JaroslavBeno.

]]>
http://jaroslavbeno.sk/kotlin-polia/feed/ 0
Kotlin when http://jaroslavbeno.sk/kotlin-when/?utm_source=rss&utm_medium=rss&utm_campaign=kotlin-when http://jaroslavbeno.sk/kotlin-when/#respond Fri, 22 May 2020 03:39:44 +0000 http://jaroslavbeno.sk/?p=585 Predstav si, že napíšeš aplikáciu, kde používateľ bude čítať dáta z konzoly, ak niečo zadá, tak sa má niečo vykonať, ak zadá niečo iné, tak sa vykoná niečo iné. Napríklad budeš mať aplikáciu, kde používateľ bude vyberať smer kade má ísť. Ak napíše SEVER, tak na konzolu niečo vypíšeme, ak napíše JUH, tak sa stane niečo […]

The post Kotlin when appeared first on JaroslavBeno.

]]>
Predstav si, že napíšeš aplikáciu, kde používateľ bude čítať dáta z konzoly, ak niečo zadá, tak sa má niečo vykonať, ak zadá niečo iné, tak sa vykoná niečo iné. Napríklad budeš mať aplikáciu, kde používateľ bude vyberať smer kade má ísť. Ak napíše SEVER, tak na konzolu niečo vypíšeme, ak napíše JUH, tak sa stane niečo iné.

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")
}

Najnovšie články

The post Kotlin when appeared first on JaroslavBeno.

]]>
http://jaroslavbeno.sk/kotlin-when/feed/ 0