when – >wybór jednej z opcji

Gdy warunków jest wiele, kaskada else if robi się nieczytelna. Kotlin oferuje wygodniejsze when – odpowiednik konstrukcji wyboru znanej z innych języków, ale mocniejszy: dopasuje wiele wartości naraz, sprawdzi zakres, zadziała bez argumentu, a nawet zwróci wartość.

when 1, 2 -> in 1..5 jako wyrażenie
1

when – podstawy

when bierze wartość w nawiasie i porównuje ją kolejno z gałęziami. Wykonuje gałąź pierwszej pasującej wartości, a gdy nic nie pasuje – gałąź else. Po lewej stronie strzałki -> jest wartość do dopasowania, po prawej – co zrobić.

Dopasowanie do wartości
val dzien = 3

when (dzien) {
    1 -> println("Poniedziałek")
    2 -> println("Wtorek")
    3 -> println("Środa")
    else -> println("Inny dzień")
}
Brak „przelatywania” – nie trzeba break

W Kotlinie wykonuje się tylko jedna dopasowana gałąź; sterowanie nie „przelatuje” do następnych. Dlatego nie używamy tu instrukcji break (znanej z konstrukcji wyboru w innych językach) – jest niepotrzebna.

2

Wiele wartości w jednej gałęzi

Jeśli kilka wartości ma prowadzić do tej samej akcji, wypisujemy je po przecinku:

Kilka wartości po przecinku
val ocena = 5

when (ocena) {
    1, 2 -> println("Niezaliczone")
    3, 4 -> println("Zaliczone")
    5, 6 -> println("Bardzo dobrze!")
    else -> println("Nieznana ocena")
}
3

Zakresy: in 1..5

Gałąź może też sprawdzać, czy wartość mieści się w zakresie. Zapis 1..5 oznacza „od 1 do 5 (włącznie)”, a słowo in pyta „czy należy do”. Pełne omówienie zakresów czeka w następnej lekcji – tu wystarczy ten prosty schemat.

Punkty na ocenę – zakresami
val punkty = 75

when (punkty) {
    in 0..49   -> println("Niedostateczny")
    in 50..74  -> println("Dostateczny")
    in 75..89  -> println("Dobry")
    in 90..100 -> println("Bardzo dobry")
    else -> println("Błędna liczba punktów")
}
4

when bez argumentu

Gdy pominiesz wartość w nawiasie, każda gałąź staje się osobnym warunkiem (typu Boolean). To bardzo czytelny zamiennik długiej kaskady else if – Kotlin wybiera pierwszy prawdziwy warunek.

Gałęzie jako warunki
val liczba = -5

when {
    liczba > 0 -> println("Dodatnia")
    liczba < 0 -> println("Ujemna")
    else -> println("Zero")
}
5

when jako wyrażenie

Podobnie jak if, when potrafi zwrócić wartość. Wynik wybranej gałęzi można od razu przypisać do zmiennej – to bardzo zwięzły sposób na „przetłumaczenie” jednej wartości na drugą.

Ocena liczbowa na słowną
val ocena = 4

val opis = when (ocena) {
    6 -> "celujący"
    5 -> "bardzo dobry"
    4 -> "dobry"
    3 -> "dostateczny"
    2 -> "dopuszczający"
    else -> "niedostateczny"
}

println("Ocena: $opis")   // Ocena: dobry
when jako wyrażenie wymaga else

Gdy wynik when przypisujesz do zmiennej, musi on dać wartość w każdym przypadku. Dlatego niemal zawsze potrzebna jest gałąź else – ona „łapie” wszystkie pozostałe sytuacje.

6

Gałąź jako blok

Jeśli w gałęzi ma się wykonać więcej niż jedna instrukcja, ujmij ją w klamry. Tak jak w if, gdy when jest wyrażeniem, wartością gałęzi jest jej ostatnia linia.

Wiele instrukcji w gałęzi
val znak = "+"
val a = 6
val b = 4

when (znak) {
    "+" -> {
        println("Dodaję liczby...")
        println("Wynik: ${a + b}")
    }
    "-" -> println("Wynik: ${a - b}")
    else -> println("Nieznana operacja")
}
7

Częste błędy

❌ Błąd 1: when jako wyrażenie bez else

❌ Brak gałęzi else

val opis = when (ocena) {
    5 -> "bdb"
    4 -> "db"
}
// Błąd! brak wartości dla
// pozostałych przypadków

✅ Z gałęzią else

val opis = when (ocena) {
    5 -> "bdb"
    4 -> "db"
    else -> "inna"
}

❌ Błąd 2: dwukropek zamiast strzałki

❌ Składnia z :

when (dzien) {
    1: println("Pn")
    // Błąd! gałąź oddziela
    // strzałka ->, nie :

✅ Strzałka ->

when (dzien) {
    1 -> println("Pn")
}

❌ Błąd 3: zakres bez słowa in

❌ Sam zakres

when (punkty) {
    50..74 -> "dst"
    // Błąd! przy zakresie
    // potrzebne jest in

✅ in przed zakresem

when (punkty) {
    in 50..74 -> "dst"
}

❌ Błąd 4: zbędny break z przyzwyczajenia

❌ break w gałęzi

when (dzien) {
    1 -> {
        println("Pn")
        break
    }
}
// Błąd! break nie należy
// do when

✅ Bez break

when (dzien) {
    1 -> println("Pn")
}
// jedna gałąź = koniec
8

Podsumowanie

  • when (x) { wartość -> akcja; else -> akcja } wykonuje gałąź pierwszej pasującej wartości.
  • Brak „przelatywania” – wykonuje się jedna gałąź, bez break.
  • Kilka wartości w jednej gałęzi rozdzielamy przecinkiem: 1, 2 -> ....
  • Zakres sprawdzamy słowem in: in 1..5 -> ....
  • when bez argumentu traktuje każdą gałąź jako osobny warunek – zastępuje długie else if.
  • when może być wyrażeniem (zwraca wartość); wtedy gałąź else jest praktycznie wymagana.
  • Gałąź może być blokiem w klamrach; jej wartością jest ostatnia linia.
9

Zadania do wykonania

Zadania z wczytywaniem uruchamiaj w IntelliJ IDEA; pozostałe w Kotlin Playground.

Zadanie 1 łatwe

Wczytaj numer dnia tygodnia (1–7) i za pomocą when wypisz jego nazwę. Dla wartości spoza zakresu użyj gałęzi else.

Zadanie 2 łatwe

Wczytaj ocenę (1–6) i użyj when z wieloma wartościami w gałęziach (np. 1, 2 -> ...), aby wypisać krótki komentarz.

Zadanie 3 łatwe

Wczytaj liczbę punktów (0–100) i wypisz ocenę słowną, używając when z zakresami (in ...).

Zadanie 4 średnie

Napisz prosty kalkulator: wczytaj dwie liczby oraz znak operacji (+, -, *, /). Użyj when jako wyrażenia, aby obliczyć wynik i przypisać go do zmiennej, a następnie go wypisz. Pamiętaj o gałęzi else dla nieznanego znaku.