Kurs „Kotlin” dla programistów 2: podstawy Kotlin

Te ćwiczenia są częścią kursu Kotlin dla programistów. Skorzystaj z tego kursu, jeśli będziesz wykonywać kolejno kilka ćwiczeń z programowania. W zależności od Twojej wiedzy możesz mieć dostęp do niektórych sekcji. Ten kurs jest przeznaczony dla programistów, którzy znają język zorientowany na obiekty i chcą się dowiedzieć Kotlina.

Wprowadzenie

W tym ćwiczeniu z podstaw programowania poznasz podstawy języka Kotlin: typy danych, operatory, zmienne, struktury kontrolne oraz wartości null i null. Ten kurs jest przeznaczony dla programistów, którzy znają język zorientowany na obiekty i chcą się nauczyć Kotlina.

Lekcje nie obejmują jednej przykładowej aplikacji, ale mają one na celu pogłębianie wiedzy. Między innymi należy jednak pamiętać o zależności od siebie. W połączeniu wiele z przykładów wykorzystuje motyw akwariowy. A jeśli chcesz zobaczyć pełne informacje o oceanarium, zapoznaj się z kursem Kotlin Bootcamp for Programmers (Ukocity) na platformie Udacity.

Co musisz wiedzieć

  • Jak utworzyć projekt w IntelliJ IDEA
  • Jak otwierać i uruchamiać kod w REPL (Read-Eval-Print Loop) w IntelliJ IDEA (Tools > Kotlin > Kotlin REPL)

Czego się nauczysz

  • Jak używać typów danych, operatorów i zmiennych w Kotlin
  • Praca z wartościami logicznymi i warunkami
  • Różnica między zmiennymi null i null
  • Jak działają tablice, listy i pętle w Kotlinie

Jakie zadania wykonasz:

  • Naucz się podstaw Kotlina w Kotlin

W tym zadaniu poznasz operatory i typy w języku programowania Kotlin.

Krok 1. Poznaj operatory liczbowe

  1. Otwórz IntelliJ IDEA, jeśli jeszcze nie jest otwarty.
  2. Aby otworzyć Kotlin REPL, wybierz Tools (Narzędzia) > Kotlin > Kotlin REPL.

Tak jak w przypadku innych języków, Kotlin korzysta z atrybutów +, -, * i /, aby dodać plus, minus, czas i dzielenie. Kotlin obsługuje też różne typy liczb, takie jak Int, Long, Double i Float.

  1. Wpisz następujące wyrażenia w REPL. Aby zobaczyć wynik, naciśnij Control+Enter (Command+Enter na Macu) po każdym z nich.
1+1
⇒ res8: kotlin.Int = 2

53-3
⇒ res9: kotlin.Int = 50

50/10
⇒ res10: kotlin.Int = 5

1.0/2.0
⇒ res11: kotlin.Double = 0.5

2.0*3.5
⇒ res12: kotlin.Double = 7.0

Pamiętaj, że wyniki operacji zachowują typy operandów, więc 1/2 = 0, ale 1,0/2,0 = 0,5.

  1. Wypróbuj różne wyrażenia z różnymi kombinacjami liczb całkowitych i dziesiętnych.
6*50
⇒ res13: kotlin.Int = 300

6.0*50.0
⇒ res14: kotlin.Double = 300.0

6.0*50
⇒ res15: kotlin.Double = 300.0
  1. Wywołaj kilka metod numerów. Kotlin zachowuje liczby jako podstawowe, ale pozwala wywoływać metody wyrażone w postaci obiektów.
2.times(3)
⇒ res5: kotlin.Int = 6

3.5.plus(4)
⇒ res8: kotlin.Double = 7.5

2.4.div(2)
⇒ res9: kotlin.Double = 1.2

Krok 2. Przećwicz użycie typów

Kotlin domyślnie nie konwertuje typów liczb, więc nie możesz przypisać krótkiej wartości bezpośrednio do długiej zmiennej ani Byte do Int. Jest to spowodowane częstym błędem w programach. Podczas przesyłania możesz w każdej chwili przypisać wartości do różnych typów.

  1. Aby zobaczyć możliwe przesyłanie, zdefiniuj zmienną typu Int w REPL.
val i: Int = 6
  1. Utwórz nową zmienną, a potem wpisz nazwę zmiennej widoczną powyżej i ciąg .to.
val b1 = i.to

IntelliJ IDEA wyświetla listę możliwych realizacji. To autouzupełnianie działa w przypadku zmiennych i obiektów dowolnego typu.

  1. Wybierz z listy toByte() i wydrukuj zmienną.
val b1 = i.toByte()
println(b1)
⇒ 6
  1. Przypisz wartość Byte do zmiennych różnych typów.
val b2: Byte = 1 // OK, literals are checked statically
println(b2)
⇒ 1

val i1: Int = b2
⇒ error: type mismatch: inferred type is Byte but Int was expected

val i2: String = b2
⇒ error: type mismatch: inferred type is Byte but String was expected

val i3: Double = b2
⇒ error: type mismatch: inferred type is Byte but Double was expected
  1. Jeśli projekt zwrócił błędy, spróbuj je przesłać.
val i4: Int = b2.toInt() // OK!
println(i4)
⇒ 1

val i5: String = b2.toString()
println(i5)
⇒ 1

val i6: Double = b2.toDouble()
println(i6)
⇒ 1.0
  1. Aby ułatwić czytanie długich stałych liczbowych, Kotlin umożliwia umieszczanie podkreśleń w cyfrach, gdzie ma to sens. Spróbuj wpisać różne stałe wartości liczbowe.
val oneMillion = 1_000_000
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

Krok 3. Poznaj wartość typów zmiennych

Kotlin obsługuje 2 typy zmiennych: zmienne i niezmienne. W aplikacji val możesz przypisać wartość raz. Jeśli spróbujesz ponownie przypisać coś, pojawi się błąd. Za pomocą wartości var możesz przypisać wartość, a następnie zmienić ją później w programie.

  1. Zdefiniuj zmienne za pomocą val i var, a następnie przypisz do nich nowe wartości.
var fish = 1
fish = 2
val aquarium = 1
aquarium = 2
⇒ error: val cannot be reassigned

Możesz przypisać wartość fish, a potem ustawić nową wartość, bo jest ona zdefiniowana w var. Przypisanie nowej wartości do funkcji aquarium powoduje wyświetlenie błędu, ponieważ jest zdefiniowany za pomocą atrybutu val.

Typ przechowywany w zmiennej jest określany, gdy kompilator ustali go na podstawie kontekstu. Jeśli chcesz, możesz zawsze określić typ zmiennej, korzystając z notacji dwukropka.

  1. Zdefiniuj niektóre zmienne i wyraźnie określ typ.
var fish: Int = 12
var lakes: Double = 2.5

Po przypisaniu typu przez Ciebie lub kompilatora nie możesz go zmienić lub wystąpił błąd.

Krok 4. Więcej informacji o ciągach tekstowych

Ciągi znaków w Kotlin działają podobnie do ciągów znaków w dowolnym innym języku programowania. Ciągi tekstowe w języku " używają tylko znaków, a ' – pojedynczych znaków. Możesz też połączyć ciągi z operatorem +. Szablony ciągów możesz tworzyć, łącząc je z wartościami. Nazwa $variable zostanie zastąpiona tekstem reprezentującym wartość. Jest to tzw. interpolacja zmiennych.

  1. Utwórz szablon ciągu znaków.
val numberOfFish = 5
val numberOfPlants = 12
"I have $numberOfFish fish" + " and $numberOfPlants plants"
⇒ res20: kotlin.String = I have 5 fish and 12 plants
  1. Utwórz szablon ciągu znaków z wyrażeniem. Tak jak w przypadku innych języków, wartością może być wyrażenie. Do definiowania wyrażenia użyj nawiasów klamrowych {}.
"I have ${numberOfFish + numberOfPlants} fish and plants"
⇒ res21: kotlin.String = I have 17 fish and plants

W tym zadaniu poznasz wartości logiczne i sprawdzasz warunki w języku programowania Kotlin. Podobnie jak inne języki Kotlin ma wartości logiczne i operatory logiczne, np. mniejsze niż, równe, większe itd. (<, ==, >, !=, <=, >=).

  1. Napisz oświadczenie if/else.
val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {
    println("Good ratio!") 
} else {
    println("Unhealthy ratio")
}
⇒ Good ratio!
  1. Spróbuj podać zakres w instrukcji if. Testowany przez Kotlin warunek może używać zakresów.
val fish = 50
if (fish in 1..100) {
    println(fish)
}
⇒ 50
  1. Napisz if z wieloma przypadkami. W przypadku bardziej złożonych warunków użyj logicznych i && oraz logicznych lub ||. Tak jak w przypadku innych języków, możesz używać wielu przypadków za pomocą funkcji else if.
if (numberOfFish == 0) {
    println("Empty tank")
} else if (numberOfFish < 40) {
    println("Got fish!")
} else {
    println("That's a lot of fish!")
}
⇒ That's a lot of fish!
  1. Wypróbuj oświadczenie when. Jest to łatwiejsza metoda zapisu serii instrukcji if/else if/else w Kotlinie za pomocą instrukcji when, która wygląda tak samo jak wyrażenie switch w innych językach. Warunki mogą też być używane w instrukcjach when.
when (numberOfFish) {
    0  -> println("Empty tank")
    in 1..39 -> println("Got fish!")
    else -> println("That's a lot of fish!")
}
⇒ That's a lot of fish!

W tym zadaniu poznasz zmienne o wartości null i puste. Błędy programowe dotyczące wartości null powodują niezliczone błędy. Kotlin stara się zmniejszyć liczbę błędów, wprowadzając zmienne o wartości null.

Krok 1. Więcej informacji o wartości null

Domyślnie zmienne nie mogą mieć wartości null.

  1. Zadeklaruj atrybut Int i przypisz do niego element null.
var rocks: Int = null
⇒ error: null can not be a value of a non-null type Int
  1. Użyj operatora znaku zapytania ? po typie, by wskazać, że zmienna może być pusta. Zadeklaruj atrybut Int? i przypisz do niego element null.
var marbles: Int? = null

Jeśli masz złożone typy danych, takie jak lista:

  • Możesz dopuścić puste elementy listy.
  • Możesz na liście wpisać wartość null, ale jeśli zasada nie jest pusta, jej elementy nie mogą mieć wartości null.
  • Zarówno lista, jak i elementy mogą być puste.

Listy i niektóre złożone typy danych zostaną omówione w dalszym zadaniu.

Krok 2. Poznaj operatory ?:

Możesz używać null do testowania z operatorem ?, oszczędzając Ci kłopoty związane z tworzeniem instrukcji if/else.

  1. Napisz kod dłużej, aby sprawdzić, czy zmienna fishFoodTreats nie jest null. Następnie zmniejsz tę zmienną.
var fishFoodTreats = 6
if (fishFoodTreats != null) {
    fishFoodTreats = fishFoodTreats.dec()
}
  1. Spójrz na sposób zapisu słowa Kotlin za pomocą operatora ?.
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
  1. Do łańcucha testów pustych możesz też używać operatora ?:. Spójrz na ten przykład:
fishFoodTreats = fishFoodTreats?.dec() ?: 0

Jest to skrót , który określa, czy fishFoodTreats ma wartość inną niż null, obniż i użyj tej wartości. W przeciwnym razie użyj wartości po ?:, która wynosi 0." Jeśli fishFoodTreats ma wartość null, ocena jest zatrzymana, a metoda dec() nie jest wywoływana.

Wskazówka na temat pustych wskaźników

Jeśli kochasz NullPointerExceptions, Kotlin pozwoli Ci je zachować. Operator potwierdzenia o wartości null: !! (podwójny zbiór) przekształca dowolną wartość na typ inny niż null i tworzy wyjątek, jeśli wartość to null.

val len = s!!.length   // throws NullPointerException if s is null

W tym zadaniu poznasz tablice i listy oraz dowiesz się, jak tworzyć pętle w języku programowania Kotlin.

Krok 1. Utwórz listy

Listy są podstawowym typem w Kotlinie i przypominają listy w innych językach.

  1. Zadeklaruj listę za pomocą listOf i ją wydrukuj. Tej listy nie można zmienić.
val school = listOf("mackerel", "trout", "halibut")
println(school)
⇒ [mackerel, trout, halibut]
  1. Zadeklaruj listę, którą można zmieniać za pomocą mutableListOf. Usuń element.
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")
⇒ res36: kotlin.Boolean = true

Metoda remove() zwraca true, gdy zostanie usunięty.

Krok 2. Utwórz tablice

Podobnie jak inne języki, Kotlin ma tablice. W przeciwieństwie do list w Kotlinie, które zawierają wersje stałe i zmienne, nie ma wersji Array z możliwością zmiany. Po utworzeniu tablicy rozmiar jest stały. Nie możesz dodawać ani usuwać elementów, tylko kopiując je do nowej tablicy.

Zasady korzystania z atrybutów val i var są takie same jak w przypadku tablic.

  1. Zadeklaruj tablicę ciągów znaków za pomocą arrayOf. Wydrukuj te dane przy użyciu narzędzia tablicy java.util.Arrays.toString().
val school = arrayOf("shark", "salmon", "minnow")
println(java.util.Arrays.toString(school))
⇒ [shark, salmon, minnow]
  1. Tablica zadeklarowana jako arrayOf nie ma typu powiązanego z elementami, więc można zestawiać ze sobą typy, co jest przydatne. Zadeklaruj tablicę o różnych typach.
val mix = arrayOf("fish", 2)
  1. Tablice możesz też zadeklarować jednym typem dla wszystkich elementów. Zadeklaruj tablicę liczb całkowitych za pomocą funkcji intArrayOf(). W przypadku tablic innego typu istnieją odpowiednie kreatory, czyli funkcje tworzenia instancji.
val numbers = intArrayOf(1,2,3)
  1. Połącz 2 tablice z operatorem +.
val numbers = intArrayOf(1,2,3)
val numbers3 = intArrayOf(4,5,6)
val foo2 = numbers3 + numbers
println(foo2[5])
=> 3
  1. Wypróbuj różne kombinacje zagnieżdżonych tablic i list. Tak jak w przypadku innych języków, możesz zagnieżdżać tablice i listy. Oznacza to, że jeśli umieścisz tablicę w tablicy, masz tablicę tablic, a nie spłaszczony jej blok. Elementy tablicy mogą być też listami, a elementami list mogą być tablicami.
val numbers = intArrayOf(1, 2, 3)
val oceans = listOf("Atlantic", "Pacific")
val oddList = listOf(numbers, oceans, "salmon")
println(oddList)
⇒ [[I@89178b4, [Atlantic, Pacific], salmon]

Pierwszy element, numbers, to Array. Gdy nie wydrukusz za pomocą narzędzia tablicy, Kotlin wydrukuje adres zamiast zawartości tablicy.

  1. Kotlin ma miłą zaletę: możesz inicjować tablice za pomocą kodu, a nie na 0. Skorzystaj z tego przykładu:
val array = Array (5) { it * 2 }
println(java.util.Arrays.toString(array))
⇒ [0, 2, 4, 6, 8]

Kod inicjowania jest między nawiasami klamrowymi: {}. W kodzie it odnosi się do indeksu tablicy, zaczynając od 0.

Krok 3. Utwórz pętle

Teraz gdy masz już listy i tablice, pętle elementów działają zgodnie z oczekiwaniami.

  1. Utwórz tablicę. Użyj pętli for, aby iterować przez tablicę i drukować elementy.
val school = arrayOf("shark", "salmon", "minnow")
for (element in school) {
    print(element + " ")
}
⇒ shark salmon minnow
  1. W Kotlin możesz wyświetlać elementy i indeksy w tym samym czasie. Skorzystaj z tego przykładu:
for ((index, element) in school.withIndex()) {
    println("Item at $index is $element\n")
}
⇒ Item at 0 is shark
Item at 1 is salmon
Item at 2 is minnow
  1. Wypróbuj różne rozmiary i zakresy kroków. Zakres liczb lub znaków może być określony alfabetycznie. Tak jak w przypadku innych języków, nie musisz przechodzić dalej o 1. Aby się cofnąć, użyj downTo.
for (i in 1..5) print(i)
⇒ 12345

for (i in 5 downTo 1) print(i)
⇒ 54321

for (i in 3..6 step 2) print(i)
⇒ 35

for (i in 'd'..'g') print (i)
⇒ defg
  1. Wypróbuj kilka pętli. Podobnie jak inne języki Kotlin zawiera pętle while, pętle do...while oraz operatory ++ i --. Kotlin ma też repeat pętli.
var bubbles = 0
while (bubbles < 50) {
    bubbles++
}
println("$bubbles bubbles in the water\n")

do {
    bubbles--
} while (bubbles > 50)
println("$bubbles bubbles in the water\n")

repeat(2) {
     println("A fish is swimming")
}
⇒ 50 bubbles in the water
49 bubbles in the water
A fish is swimmingA fish is swimming

Kotlin bardzo przypomina inne języki, takie jak operatory, listy i pętle, ale występują między nimi istotne różnice.

Te funkcje mogą być inne w Kotlin niż w innych językach:

  • Typy Kotlin nie są domyślnie konwertowane – użyj przesyłania.
  • Zmienne zadeklarowane za pomocą funkcji val można przypisać tylko raz.
  • Zmienne Kotlin domyślnie nie są puste. Użyj wartości ?, aby zmienne miały wartość null.
  • Kotlin umożliwia przeglądanie indeksu i elementów tablicy w tym samym czasie w pętli for.

Te konstrukcje programowania Kotlin są podobne do tych w innych językach:

  • Tablice i listy mogą mieć jeden typ lub typy mieszane.
  • Tablice i listy mogą być zagnieżdżone.
  • Pętle możesz tworzyć za pomocą for, while, do/while i repeat.
  • Instrukcja when to wersja instrukcji switch Kotlin, ale when jest bardziej elastyczna.

Dokumentacja Kotlin

Jeśli chcesz dowiedzieć się więcej na dowolny temat dotyczący tego kursu lub nie wiesz, co zrobić, wejdź na https://kotlinlang.org.

Samouczki Kotlin

Na stronie https://try.kotlinlang.org znajdziesz szczegółowe samouczki o nazwie Kotlin Koans, internetowe narzędzie do tłumaczenia, a także kompletny zestaw dokumentacji referencyjnej z przykładami.

Kurs Udacity

Kurs Udacity na ten temat znajdziesz na kursie Kotlin dla programistów.

IntelLIJ IDEA

Dokumentację IntelliJ IDEA znajdziesz na stronie JetBrains.

Ta sekcja zawiera listę możliwych zadań domowych dla uczniów, którzy pracują w ramach tego ćwiczenia w ramach kursu prowadzonego przez nauczyciela. To nauczyciel może wykonać te czynności:

  • W razie potrzeby przypisz zadanie domowe.
  • Poinformuj uczniów, jak przesyłać zadania domowe.
  • Oceń projekty domowe.

Nauczyciele mogą wykorzystać te sugestie tak długo, jak chcą lub chcą, i mogą przypisać dowolne zadanie domowe.

Jeśli samodzielnie wykonujesz te ćwiczenia z programowania, możesz sprawdzić swoją wiedzę w tych zadaniach domowych.

Odpowiedz na te pytania

Pytanie 1

Który z tych stwierdzeń zawiera listę ciągów znaków, których nie można zmienić?

val school = arrayOf("shark", "salmon", "minnow")

var school = arrayOf("shark", "salmon", "minnow")

val school = listOf("shark", "salmon", "minnow")

val school = mutableListOf("shark", "salmon", "minnow")

Pytanie 2

Jaki będzie wynik tego kodu?
for (i in 3..8 step 2) print(i)

▢ 345678

▢ 468

▢ 38

▢ 357

Pytanie 3

Jaki jest cel znaku zapytania w tym kodzie?
var rocks: Int? = 3

▢ Typ zmiennej rocks nie jest stały.

▢ Zmienną rocks można ustawić na wartość null.

▢ Zmienną rocks nie można ustawić na wartość null.

▢ Zmienna rocks nie powinna być od razu inicjowana.

Przejdź do następnej lekcji: 3. Funkcje

Omówienie kursu, w tym linki do innych ćwiczeń z programowania, znajdziesz w artykule "Kotlin Bootcamp for Programmers: Witamy na kursie."