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 – 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ć.
val dzien = 3 when (dzien) { 1 -> println("Poniedziałek") 2 -> println("Wtorek") 3 -> println("Środa") else -> println("Inny dzień") }
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.
Wiele wartości w jednej gałęzi
Jeśli kilka wartości ma prowadzić do tej samej akcji, wypisujemy je po przecinku:
val ocena = 5 when (ocena) { 1, 2 -> println("Niezaliczone") 3, 4 -> println("Zaliczone") 5, 6 -> println("Bardzo dobrze!") else -> println("Nieznana ocena") }
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.
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") }
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.
val liczba = -5 when { liczba > 0 -> println("Dodatnia") liczba < 0 -> println("Ujemna") else -> println("Zero") }
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ą.
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
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.
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.
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") }
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
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 -> .... whenbez argumentu traktuje każdą gałąź jako osobny warunek – zastępuje długieelse if.whenmoże być wyrażeniem (zwraca wartość); wtedy gałąźelsejest praktycznie wymagana.- Gałąź może być blokiem w klamrach; jej wartością jest ostatnia linia.
Zadania do wykonania
Zadania z wczytywaniem uruchamiaj w IntelliJ IDEA; pozostałe w Kotlin Playground.
Wczytaj numer dnia tygodnia (1–7) i za pomocą when wypisz jego nazwę.
Dla wartości spoza zakresu użyj gałęzi else.
Wczytaj ocenę (1–6) i użyj when z wieloma wartościami
w gałęziach (np. 1, 2 -> ...), aby wypisać krótki komentarz.
Wczytaj liczbę punktów (0–100) i wypisz ocenę słowną, używając when
z zakresami (in ...).
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.