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ää.
Ero sivun ”Kotlin” versioiden välillä
Ak: Uusi sivu: == Johdanto == : [https://kotlinlang.org/docs/home.html Kotlin Programming Language] Ohjelmointikieli. Luokka:Tietokoneet |
Ei muokkausyhteenvetoa |
||
| (2 välissä olevaa versiota samalta käyttäjältä ei näytetä) | |||
| Rivi 2: | Rivi 2: | ||
: [https://kotlinlang.org/docs/home.html Kotlin Programming Language] | : [https://kotlinlang.org/docs/home.html Kotlin Programming Language] | ||
Ohjelmointikieli. | 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 | |||
=== Tiedon syöttäminen === | |||
* '''readln'' // lukee koko rivin | |||
println("Kirjoita jotain: ") | |||
val nimi = readln() | |||
print(nimi) | |||
val numero = readln().toInt() | |||
=== Tulostus === | |||
* '''print''' // tulostaa esimerkiksi tekstin | |||
** print("teksti") | |||
* '''println''' // tulostaa esimerkiksi tekstin ja lisää rivinvaihdon | |||
** println("teksti") | |||
** println(10) | |||
** 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 == | |||
* Sovelluspaketti, esim. MainActivity.kt alkaa paketin määrittelyllä | |||
package nimi | |||
import ... | |||
* enableEdgeToEdge() // sovellus täyttää koko näytön | |||
== Android Studio == | |||
Sovellus, jossa voidaan tehdä Android-sovelluksia. Kyseessä on Integrated Development Environment (IDE). Käyttöä helpottaa Java ja Kotlin -ohjelmointikielien hallinta. | |||
=== 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 1 === | |||
Seuraavassa ohjeessa avataan Android Studion mukana tuleva Hello Andoid! ja siirretään se Android-puhelimeen sovellukseksi. | |||
# Asenna Android Studio -sovellus internetistä tietokoneelle. | |||
# 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. | |||
# 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. | |||
# Klikataan Build & Refresh esikatseluvälilehdessä. Hetken kuluttua tulostuu ''Hello Android!'' | |||
# Koodi on tiedostossa ''MainActivity.kt'' | |||
## package com.example.nimi | |||
## import ... // ??? | |||
## class MainActivity : ComponentActivity() // ??? | |||
## ''onCreate()'' -funktio kutsuu muut funktiot ja on sama kuin Kotlin-ohjelmointikielen ''main()'' -funktio. Tässä olevia käytetään Android-puhelimen sovelluksessa. | |||
### override fun onCreate(savedInstanceState: Bundle?) // ??? | |||
### super.onCreate(savedInstanceState) // ??? | |||
## ''setContent()'' -funktio asettaa sovelluksen ulkoasun. | |||
## 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. | |||
## ''@Preview'' yhdessä ''@Composable'' kanssa näyttää sovelluksen Android Studion esikatseluväilehdellä. ''@Preview'' alla olevat funktiot eivät vaikuta sovellukseen, joka pyörii Android-puhelimessa. | |||
## ''GreetingPreview()'' -funktio näyttää muutokset ilman että koko sovelluta tarvitsee aina uudelleen kääntää tietokoneen ymmärtämäksi. | |||
## ''Greeting()'' -funktio tulostaa sille annetun nimen saatetekstillä. | |||
# Androidissa asetetaan ''USB debugging'': Asetukset > Sovelluskehittäjien asetukset > USB-vianetsintä (USB debuggin). | |||
# Kytketään Android tietokoneeseen USB-kaapelilla tai Wi-Fi-yhteydellä. | |||
## USB-yhteys: Kytketään kaapeli | |||
## 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. | |||
# Klikataan Run Android Studion Play-painiketta yläosassa ikkunassa > sovellus käynnistyy hetken kuluttua Androidissa ja lisää ohjeen alussa nimetyn nimisen sovelluksen valikkoon. | |||
# 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. | |||
## Kytketään ääni macOS: Android Studio > Settings > Tools > Device Mirroring > Redirect audio from local devices. | |||
=== Kotlin-sovellus puhelimeen 2 === | |||
# Asenna Android Studio -sovellus internetistä tietokoneelle. | |||
# 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. | |||
# Avataan activity_main.xml -tiedosto, joka sijaitsee Android > app/res/layout > valitaan oikeasta yläkulmasta 4 viivaa (Code). | |||
## Jos tiedostoa ei ole: klikataan res-kansiota hiiren oikealla > New > Android Resource File > File name: activity_main.xml > Resource type: Layout > OK | |||
== Lähteet == | |||
: https://kotlinlang.org/docs | |||
[[Luokka:Tietokoneet]] | [[Luokka:Tietokoneet]] | ||
Nykyinen versio 1. toukokuuta 2025 kello 23.10
Johdanto
[muokkaa]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
[muokkaa]Funktio
[muokkaa]- 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
[muokkaa]- Kirjoitetaan {} sisään
- Parametrien jälkeen -> ja sen jälkeen funktio
val nimi2 = { nimi: String -> nimi.uppercase() }
Funktioita
[muokkaa]- Muunnos isoiksi kirjaimiksi
- return nimi.uppercase()
Jos (if), kun (when)
[muokkaa]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
Tiedon syöttäminen
[muokkaa]- 'readln // lukee koko rivin
println("Kirjoita jotain: ")
val nimi = readln()
print(nimi)
val numero = readln().toInt()
Tulostus
[muokkaa]- print // tulostaa esimerkiksi tekstin
- print("teksti")
- println // tulostaa esimerkiksi tekstin ja lisää rivinvaihdon
- println("teksti")
- println(10)
- println(muuttujanimi)
- println("Muuttujan arvo on $muuttujanimi")
- println("Muuttujan arvo lisättynä viidellä on ${muuttujanimi + 5}") // voi olla myös val
Toisto
[muokkaa]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
[muokkaa]- // kommentti
Muuttujat
[muokkaa]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
[muokkaa]- 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
[muokkaa]List
[muokkaa]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
- val nimi = listOf("mansikka", "mustikka")
- 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
- val nimi: MutableList<String> = mutableListOf("mansikka", "mustikka")
Set
[muokkaa]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
[muokkaa]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
[muokkaa]- 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
[muokkaa]Valmiita luokkia Kotlinissa.
- data class Luokkanimi(val nimi: String, var nimi2: Int)
Null
[muokkaa]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
[muokkaa]- Sovelluspaketti, esim. MainActivity.kt alkaa paketin määrittelyllä
package nimi import ...
- enableEdgeToEdge() // sovellus täyttää koko näytön
Android Studio
[muokkaa]Sovellus, jossa voidaan tehdä Android-sovelluksia. Kyseessä on Integrated Development Environment (IDE). Käyttöä helpottaa Java ja Kotlin -ohjelmointikielien hallinta.
Tiedostojärjestelmä
[muokkaa]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 1
[muokkaa]Seuraavassa ohjeessa avataan Android Studion mukana tuleva Hello Andoid! ja siirretään se Android-puhelimeen sovellukseksi.
- Asenna Android Studio -sovellus internetistä tietokoneelle.
- 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.
- 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.
- Klikataan Build & Refresh esikatseluvälilehdessä. Hetken kuluttua tulostuu Hello Android!
- Koodi on tiedostossa MainActivity.kt
- package com.example.nimi
- import ... // ???
- class MainActivity : ComponentActivity() // ???
- onCreate() -funktio kutsuu muut funktiot ja on sama kuin Kotlin-ohjelmointikielen main() -funktio. Tässä olevia käytetään Android-puhelimen sovelluksessa.
- override fun onCreate(savedInstanceState: Bundle?) // ???
- super.onCreate(savedInstanceState) // ???
- setContent() -funktio asettaa sovelluksen ulkoasun.
- 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.
- @Preview yhdessä @Composable kanssa näyttää sovelluksen Android Studion esikatseluväilehdellä. @Preview alla olevat funktiot eivät vaikuta sovellukseen, joka pyörii Android-puhelimessa.
- GreetingPreview() -funktio näyttää muutokset ilman että koko sovelluta tarvitsee aina uudelleen kääntää tietokoneen ymmärtämäksi.
- Greeting() -funktio tulostaa sille annetun nimen saatetekstillä.
- Androidissa asetetaan USB debugging: Asetukset > Sovelluskehittäjien asetukset > USB-vianetsintä (USB debuggin).
- Kytketään Android tietokoneeseen USB-kaapelilla tai Wi-Fi-yhteydellä.
- USB-yhteys: Kytketään kaapeli
- 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.
- Klikataan Run Android Studion Play-painiketta yläosassa ikkunassa > sovellus käynnistyy hetken kuluttua Androidissa ja lisää ohjeen alussa nimetyn nimisen sovelluksen valikkoon.
- 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.
- Kytketään ääni macOS: Android Studio > Settings > Tools > Device Mirroring > Redirect audio from local devices.
Kotlin-sovellus puhelimeen 2
[muokkaa]- Asenna Android Studio -sovellus internetistä tietokoneelle.
- 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.
- Avataan activity_main.xml -tiedosto, joka sijaitsee Android > app/res/layout > valitaan oikeasta yläkulmasta 4 viivaa (Code).
- Jos tiedostoa ei ole: klikataan res-kansiota hiiren oikealla > New > Android Resource File > File name: activity_main.xml > Resource type: Layout > OK