Voit itse lisätä ja muuttaa sisältöä muokkaa-painikkeiden avulla

Ennen tallennusta suositellaan ottamaan kopio muokkausruudusta (ctrl-a -> ctrl-c)

 Olet itse vastuussa tämän teoksen käytöstä aiheutuvista vahingoista Lue lisää.

Kotlin

Wikikko - kansan taitopankkista
Versio hetkellä 1. toukokuuta 2025 kello 21.18 – tehnyt Wikikkosysop (keskustelu | muokkaukset)
Siirry navigaatioon Siirry hakuun

Johdanto

Kotlin Programming Language

Ohjelmointikieli erityisesti Android-laitteille. Yhteensopiva Javan ja muiden ohjelmointikielien kanssa.

Sivulla käytettävät otsikot ja nimet eivät ole yleisesti käytettyjä. Ne voi muuttaa vapaasti sellaisiksi.

Komennot

Funktio

  • fun määrittää funktion
    • fun funktionimi() { ... }
  • Funktion nimi aloitetaan pienellä kirjaimella ja uusi sana aloitetaan isolla kirjaimella ja kaikki sanat kirjoitetaan yhteen. Android Studiossa aloitetaan isolla alkukirjaimella @Composable-funktiot.
  • Funktion parametrit ovat () sisällä. Parametri sisältää tyypin. Parametrit erotetaan pilkulla. Palautettava tyyppi määritellään : jälkeen.
  • Funktion toiminto on {} sisällä.
  • return poistuu funktiosta esimerkiksi kun ehto täyttyy tai palauttaa jotain funktiosta. Return ei tarvitse käyttää jos palautetaan 1 arvo???
    • fun main() { ... } Ohjelmat aloitetaan main-funktiolla ja kirjoitetaan hakasulkeiden sisään.
fun funktionimi() {
    return println("teksti")
}
fun main () {
    funktionimi()
}
val nimi2 = mutableListOf ("mansikka")
fun funktionimi(nimi: String): String {
    if (nimi in nimi2) {
        return "Löytyy luettelosta."
    }
    nimi2.add(nimi) // mustikkaa ei ollut luettelossa joten lisätään
    return "Uusi nimi lisätty."
}
fun main() {
println(funktionimi("mustikka"))
fun funktionimi(nimi: String, nimi2: String) {
// fun funtionimi(nimi: String, nimi2: String = "teksti") { // oletusarvolla
    println("$nimi $nimi2")
}
fun main() {
funktionimi(nimi = "teksti", nimi2 = "teksti2")
funktionimi("teksti", "teksti2")
// funktionimi("teksti") // nimi2 käyttää oletusarvoa
fun funktionimi(a: Int, b: Int): Int { 
    return a * b
}
fun main () {
    println(funktionimi(2, 3))
fun funktionimi(a: Int, b: Int) = a * b
fun main () {
    prinln(funktionimi(2, 3))
}
  • Osaan funktioista viitataan esim. println("Ensimmäinen on ${listanimi.first()}")

Lambada

  • Kirjoitetaan {} sisään
  • Parametrien jälkeen -> ja sen jälkeen funktio
val nimi2 = { nimi: String -> nimi.uppercase() }

Funktioita

  • Muunnos isoiksi kirjaimiksi
    • return nimi.uppercase()

Jos (if), kun (when)

Suositeltavaa käyttää when.

  • when
    • Vertailtava arvo asetetaan () sisään ja ehdot ja toiminta {} sisään. Etsii järjestyksessä kunnes ehto täsmää ja tässä tulostaa sen.
    • Statement ei palauta mitään
val nimi = "punainen"
val nimi2 = when (nimi) {
"vihreä" -> "raaka"
"punainen" -> "kypsä"
else -> "tuntematon"
println(nimi2)
val nimi = "mansikka"
when (nimi) {
"mustikka" -> println("mustikka")
"mansikka" -> println("mansikka on oikein")
else -> println("ei löydy")
}
val nimi = "mansikka"
val nimi2 = when {
    nimi == "punainen" -> "kypsä"
    nimi == "vihreä" -> "raaka"
    else -> "tuntematon"
}
println(nimi2)


  • Expression palauttaa arvon. Etsii järjestyksessä kunnes ehto täsmää ja tallentaa arvon muuttujaan.
val nimi = "mansikka"
val tulos = when (nimi) {
"mustikka" -> "mustikka"
"mansikka" -> "mansikka on oikein"
else -> "ei löydy"
println(tulos)


  • if
    • Ehto asetetaan () sisään ja toiminta {} sisään.
val nimi: Int
val nimi2 = true
if (nimi2 { // on tosi eli true
    nimi = 10
} else { // on epätosi
    nimi = 20
}
val nimi = 10
val nimi2 = 20
println(if (nimi < nimi2) nimi else nimi2) // tulostaa 10

Teksti

  • print
    • print("teksti")
  • println
    • println("teksti")
    • println(muuttujanimi)
    • println("Muuttujan arvo on $muuttujanimi")
    • println("Muuttujan arvo lisättynä viidellä on ${muuttujanimi + 5}") // voi olla myös val

Toisto

1..3 tarkoittaa 1, 2, 3
'a'..'c' tarkoittaa 'a', 'b', 'c'
1..<3 tarkoittaa 1, 2
3 downTo 1 tarkoittaa 3, 2, 1
'e' downTo 'a' step 2 tarkoittaa 'e', 'c', 'a'
1..5 step 2 tarkoittaa 1, 3, 5 
  • for
    • Määrätyllä alueella toimintojen suorittaminen.
for (nimi in 1..3) {
print(nimi)
val nimi = listOf ("mansikka", "mustikka", "puolukka")
for (nimi2 in nimi) {
println("Tulostetaan $nimi2")
}
  • while
    • Toimintojen suorittaminen kunnes määrätty ehto on totta.
    • Ehto () sisään ja toiminta {} sisään.
var nimi = 0
while (nimi < 5) {
    println("tuloste")
    nimi++
}
  • 'do-while
    • Ensin suoritetaan määrättyä toimintoa X kertaa ja sitten seuraavaa toimintoa X kertaa.
var nimi = 0
var nimi2 = 0
while (nimi < 5) {
    println("tuloste") // tulostetaan 5 kertaa
}
do {
    println("tuloste2") // tulostetaan 5 kertaa
    nimi2++
} while (nimi2 < nimi) 

Kommentti

  • // kommentti

Muuttujat

Muuttujiin tallennetaan tietoa. Muuttuja voidaan määritellä main()-funktion ulkopuolella.

  • val vain luettava muuttuja, jonka arvoa ei voida muuttaa määrittelyn jälkeen. Pääsääntöisesti näitä.
    • val nimi = 5
  • var muuttuja, jonka arvoa voidaan muuttaa.
    • var nimi = 10
    • nimi += 10 tai nimi = nimi + 10
    • nimi -= 10 tai nimi *=10 tai nimi /=10 tai nimi %=

Tyypit

  • Merkkijono String
    • val nimi: String = "teksti"
  • Kokonaisarvot Byte, Short, Int, Long
    • val nimi: Int = 10
  • Float, Double
    • val hinta: Double = 9.99
  • Boolean
    • val nimi: Boolean = false
  • Char
    • val nimi: Char = "-"
  • UByte, Ushort, Uint, ULong
  • Muuttujan "muoto" voidaan määritellä myös ilman arvoa:
val nimi: Int
nimi = 10

Luettelo

List

Useita artikkeleita luettelossa.

  • ListOf() vain lukukäyttö
    • val nimi = listOf("mansikka", "mustikka")
      • println("Listan ensimmäinen on ${nimi[0]}") // luettelon määrätyn artikkelin tulostaminen
      • println("Listan ensimmäinen on ${nimi.first()}") tai viimeinen .last()
      • println("Listassa on ${nimi.count()} artikkelia") // listassa olevien lukumäärä
      • println("mustikka" in nimi) // luettelossa olevan artikkelin olemassa olon tarkistaminen, vastaus true/false
  • mutableListOf() lista, jonka artikkeleiden tyyppi on määritelty.
    • val nimi: MutableList<String> = mutableListOf("mansikka", "mustikka")
      • val nimiLukittu: List<String> = nimi // luettelon lukitseminen
      • nimi.add("puolukka") // artikkelin lisääminen listan loppuun
      • nimi.remove("mansikka") // ensimmäisen nimeen sopivan artikkelin poistaminen listalta

Set

Vain yksi kutakin samaa artikkelia huomioidaan luettelossa, vaikka olisi luettelossa useampi sama artikkeli. Ei järjestystä, jolloin listalta ei voida poimia määrättyä artikkelia.

  • setOf() vain lukukäyttö
    • val nimi = setOf("mansikka", "mustikka")
    • println("Luettelossa on ${nimi.count()} artikkelia") // luettelossa olevien lukumäärä
    • println("mustikka" in nimi) // luettelossa olevan artikkelin olemassa olon tarkistaminen, vastaus true/false


  • mutableSetOf()
    • val nimi: MutableSet<String> = mutableSetOf("mansikka", "mustikka")
    • val nimiLukittu: Set<String> = nimi // luettelon lukitseminen
      • nimi.add("puolukka") // artikkelin lisääminen listan loppuun
      • nimi.remove("mansikka") // artikkelin poistaminen listalta

Map

Artikkeleiden tallentaminen avainpareina. Arvo saadaan avainta pyytämällä. Avaimen täytyy olla ainutkertainen luettelossa.

  • mapOf()
    • val nimi = mapOf"mansikka" to 10, "mustikka" to 20)
    • println("Mustikan arvo on ${nimi["mustikka"]}") // artikkelin arvon tulostaminen
    • println(nimi.keys) // avaimien tulostus (tässä keys on ominaisuus eli property)
    • println(nimi.values) // arvojen tulostus
    • println("Luettelossa on ${nimi.count()} avainparia") // luettelossa olevien lukumäärä
    • println(nimi.containsKey("mustikka")) // luettelossa olevan artikkelin olemassa olon tarkistaminen, vastaus true/false
    • println("mustikka" in nimi) // luettelossa olevan avaimen olemassa olon tarkistaminen, vastaus true/false
    • println("mustikka" in nimi.keys) // luettelossa olevan avaimen olemassa olon tarkistaminen, vastaus true/false
    • println("10" in nimi.values) // luettelossa olevan arvon olemassa olon tarkistaminen, vastaus true/false


  • mutableMapOf()
    • val nimi: MutableMap<String, Int> = mutableMapOf("mansikka" to 10, "mustikka" to 20)
    • val nimiLukittu: Map<String, Int> = nimi // luettelon lukitseminen
    • nimi["puolukka"] = 30 // lisätään uusi avainpari luettelon loppuun
    • nimi.remove("puolukka") // poistetaan avainpari


Luokka

  • Luokka (class) määrittelee objektin luonteen.
  • Objekti (object) soveltuu tiedon tallentamiseen. Objekti luodaan luokasta.
  • class Luokkannimi // luokan määrittäminen
  • class Luokkanimi(val nimi: String, var nimi2: Int) // luokan ominaisuuksien määrittäminen
class Luokkanimi(var nimi: String = "teksti", var nimi2: Int) {
    val nimi3: String = ""
}
  • Objektin luominen luokasta tehdään määrittelemällä instanssi käyttäen konstruktoria.
class Luokkanimi(val nimi: String, var nimi2: Int) // luokka
fun main() {
    val instanssinimi = Luokkanimi("teksti", 10) // luodaan luokan instanssi ominaisuuksilla (property)
    println(instanssinimi.nimi) // tulostetaan ominaisuus
    instanssinimi.nimi = "uusiteksti" // muutetaan ominaisuus
    println("Ominaisuus on ${instanssinimi.nimi}")
    println(instanssinimi.copy()) // luodaan kopio
    println(instanssinimi.copy("teksti2")) // luodaan kopio nimellä teksti2
    println(instanssinimi.copy(nimi2 = 20)) // luodaan lopio teksti2 arvolla 20
}
class Luokkanimi(val nimi: String, var nimi2: Int) {
    fun funktionimi() {
        println(nimi)
    }
}
fun main() {
val instanssinimi = Luokkanimi("teksti", 10)
instanssinimi.funktionimi()

Data classes

Valmiita luokkia Kotlinissa.

  • data class Luokkanimi(val nimi: String, var nimi2: Int)

Null

Kun jotain ei ole vielä määritelty tai puuttuu. Oletuksena null-arvoa ei hyväksytä ja annetaan virheilmoitus. Hyväksyntä tehdään kysymysmerkillä (?).

fun main() {
    var eiKoskaanNull: String = "Arvo ei voi olla tyhjä."
    eiKoskaanNull = null
    var nullArvo: String? = "Arvoi voi olla tyhjä."
    nullArvo = null
}
  • Arvon tarkastaminen
fun tarkastus(tarkastettava: String?): String {
    if (tarkastettava != null && tarkastettava.length > 0) {
        return "Pituus on ${tarkastettava.length}."
    } else {
        return "Tyhjä."
    }
}
fun main() {
    val tarkasta: String? = null
    println(tarkastus(tarkasta))
}
  • Objektin ominaisuus, joka saattaa sisältää null-arvon
fun pituusTarkistus(tarkastettava: String?): Int? = tarkastettava?.length
fun main() {
    val tarkasta: String? = null
    println(pituusTarkitus(tarkasta))
}
  • Elvis-operaattori palauttaa nolla-arvon
fun main() {
    val tarkasta: String? = null
    println(tarkasta?.length ?: 0)
}

Android Studio

Sovellus, jossa voidaan tehdä Android-sovelluksia.

Tiedostojärjestelmä

Ruudun vasemmassa laidassa Project-välilehti. Valitaan tarvittaessa pudotusvalikosta Android, joka sisältää projektin tiedostot ja kansiot Android Studion esittämässä järjestyksessä. Pudotusvalikon project Source Files näyttää tiedostot samalla tavoin kuin tietokoneen tiedostojärjestelmässä.

Kotlin sovellus puhelimeen

Seuraavassa ohjeessa avataan Android Studion mukana tuleva Hello Andoid! ja siirretään se Android-puhelimeen sovellukseksi.

  1. Asenna Android Studio -sovellus internetistä tietokoneelle.
  2. Käynnistä sovellus > New Project > Phone and Tablet > Empty Activity // Ikkunassa valitaan tulevaan projektiin sopiva pohja, joka sisältää valmiiksi ohjelmointia tukevia osia. > annetaan projektille vapaamuotoinen nimi > Finish > odota.
  3. Klikataan Split-ikonia oikeassa yläkulmassa. Vasemmalla näkyy nyt projektin tiedostot, keskellä Kotlin-koodi ja oikealla esikatseluvälilehdessä miltä sovellus näyttää Androidin näytöllä. Tehtäessä muutoksia koodiin, se päivittyy automaattisesti esikatseluvälilehteen.
  4. Klikataan Build & Refresh esikatseluvälilehdessä. Hetken kuluttua tulostuu Hello Android!
  5. Koodi on tiedostossa MainActivity.kt
    1. package com.example.nimi
    2. import ... // ???
    3. class MainActivity : ComponentActivity() // ???
    4. onCreate() -funktio kutsuu muut funktiot ja on sama kuin Kotlin-ohjelmointikielen main() -funktio. Tässä olevia käytetään Android-puhelimen sovelluksessa.
      1. override fun onCreate(savedInstanceState: Bundle?) // ???
      2. super.onCreate(savedInstanceState) // ???
    5. setContent() -funktio asettaa sovelluksen ulkoasun.
    6. Kaikkia funktioita, joissa on @Composable-viittaus ennen funktiota, voidaan kutsua muista funktioista. @Composable-funktio ottaa jotain sisään mikä näytetään näytöllä, mutta funktio ei palauta mitään arvoa.
    7. @Preview yhdessä @Composable kanssa näyttää sovelluksen Android Studion esikatseluväilehdellä. @Preview alla olevat funktiot eivät vaikuta sovellukseen, joka pyörii Android-puhelimessa.
    8. GreetingPreview() -funktio näyttää muutokset ilman että koko sovelluta tarvitsee aina uudelleen kääntää tietokoneen ymmärtämäksi.
    9. Greeting() -funktio tulostaa sille annetun nimen saatetekstillä.
  6. Androidissa asetetaan USB debugging: Asetukset > Sovelluskehittäjien asetukset > USB-vianetsintä (USB debuggin).
  7. Kytketään Android tietokoneeseen USB-kaapelilla tai Wi-Fi-yhteydellä.
    1. USB-yhteys: Kytketään kaapeli
    2. Wi-Fi-yhteys: Yhdistetään Android-puhelin ja tietokone samaan Wi-Fi-verkkoon > klikataan ikkunan yläosasta Pixel 5-valikosta Pair Devices Using Wi-Fi > valitaan puhelimesta Asetukset > Sovelluskehittäjien asetukset > otetaan käyttöön Langaton virheenkorjaus > valitaan Langaton virheenkorjaus -kohdasta Muodosta laitepari QR-koodilla tai koodilla > skannataan Android Studion ponnahdusikkunan QR-koodi tai syötetään koodi.
  8. Klikataan Run Android Studion Play-painiketta yläosassa ikkunassa > sovellus käynnistyy hetken kuluttua Androidissa ja lisää ohjeen alussa nimetyn nimisen sovelluksen valikkoon.
  9. Peilaus (mirroring) ja Androidin käyttö hiirellä Android Studiosta. Kytketyn laitteen näyttö voidaan peilata Android Studioon: Android Studio > View > Tool Windows > Device Manager > klikataan pientä kuvaketta puhelimen nimen vieressä oikealla ja hyväksytään varoitus.
    1. Kytketään ääni macOS: Android Studio > Settings > Tools > Device Mirroring > Redirect audio from local devices.

Android

  • enableEdgeToEdge() // sovellus täyttää koko näytön

Lähteet

https://kotlinlang.org/docs