Funkcje jednowyrażeniowe
Gdy funkcja sprowadza się do jednego wyrażenia, Kotlin pozwala zapisać ją krócej –
bez klamr i return, ze znakiem =. Poznasz ten skrót, zobaczysz,
kiedy można pominąć typ zwracany, i dowiesz się, kiedy warto go stosować.
Czym jest skrócony zapis
Wiele funkcji robi tylko jedną rzecz: liczy wynik z parametrów i go zwraca.
Dla takich funkcji pełny zapis z klamrami i return jest niepotrzebnie
rozwlekły. Kotlin oferuje wtedy funkcję jednowyrażeniową – krótszy
zapis ze znakiem =.
// zapis blokowy (z poprzedniej lekcji) fun kwadrat(x: Int): Int { return x * x } // zapis jednowyrażeniowy – to samo działanie fun kwadrat(x: Int) = x * x
Składnia: = zamiast { return }
Zamiast klamr i słowa return stawiamy znak = i podajemy
jedno wyrażenie. Jego wartość staje się wynikiem funkcji.
| Element | Zapis blokowy | Zapis jednowyrażeniowy |
|---|---|---|
| Ciało | w klamrach { } | po znaku = |
| Zwracanie | słowo return | brak – wynikiem jest wyrażenie |
| Liczba instrukcji | dowolna | dokładnie jedno wyrażenie |
fun suma(a: Int, b: Int) = a + b fun szescian(x: Int) = x * x * x fun powitanie(imie: String) = "Cześć, $imie!" fun main() { println(suma(3, 5)) // 8 println(szescian(2)) // 8 println(powitanie("Anna")) // Cześć, Anna! }
Pominięcie typu zwracanego
Przy zapisie jednowyrażeniowym Kotlin potrafi sam rozpoznać typ wyniku
z wyrażenia po = – tak jak rozpoznawał typ zmiennej z jej wartości.
Dlatego typ zwracany zwykle pomijamy.
fun kwadrat(x: Int) = x * x // wynik to Int fun polowa(x: Double) = x / 2 // wynik to Double fun pelnoletni(wiek: Int) = wiek >= 18 // wynik to Boolean
Gdy wyrażenie jest złożone i z wyglądu nie widać od razu, co funkcja zwraca, podaj
typ jawnie – fun kwadrat(x: Int): Int = x * x. Działa jak dokumentacja
i ułatwia czytanie kodu innym.
if / when jako ciało funkcji
Pamiętasz, że w Kotlinie if i when są
wyrażeniami (mają wartość)? Dzięki temu mogą być całym ciałem
funkcji jednowyrażeniowej – to jeden z najwygodniejszych zapisów.
fun wiekszy(a: Int, b: Int) = if (a > b) a else b println(wiekszy(5, 8)) // 8
fun nazwaDnia(n: Int) = when (n) { 1 -> "Poniedziałek" 2 -> "Wtorek" 3 -> "Środa" else -> "Inny dzień" } println(nazwaDnia(2)) // Wtorek
Kiedy stosować
Skrócony zapis to wygoda, ale nie do wszystkiego. Prosta zasada:
| Sytuacja | Zapis |
|---|---|
| Funkcja to jedno krótkie wyrażenie | jednowyrażeniowy = |
Funkcja oparta na if/when jako wyrażeniu | jednowyrażeniowy = |
| Funkcja ma kilka kroków / zmiennych / pętlę | blokowy { ... } |
| Funkcja tylko coś wypisuje (wiele instrukcji) | blokowy { ... } |
Jeśli żeby zmieścić się w jednym wyrażeniu kod robi się nieczytelny, lepiej wróć do zapisu blokowego. Skrót ma poprawiać czytelność, a nie ją psuć.
Częste błędy
❌ Błąd 1: return w funkcji z =
❌ Zbędne return
fun kwadrat(x: Int) = return x * x // Błąd! po = podajemy // samo wyrażenie, // bez return
✅ Tylko wyrażenie
fun kwadrat(x: Int) = x * x
❌ Błąd 2: wiele instrukcji po =
❌ Dwie czynności w skróconej
fun opis(x: Int) =
println("Liczba:")
println(x)
// druga linia jest już
// POZA funkcją
✅ Wiele instrukcji = blok
fun opis(x: Int) {
println("Liczba:")
println(x)
}
❌ Błąd 3: brak znaku =
❌ Wyrażenie bez =
fun kwadrat(x: Int): Int x * x
// Błąd! potrzebny = albo
// klamry { return ... }
✅ Ze znakiem =
fun kwadrat(x: Int): Int = x * x
❌ Błąd 4: zaskakujący wywnioskowany typ
❌ Spodziewasz się 2.5
fun polowa(x: Int) = x / 2 // polowa(5) -> 2 (Int!) // dzielenie całkowite
✅ Wymuś Double w wyrażeniu
fun polowa(x: Int) = x / 2.0 // polowa(5) -> 2.5 (Double)
Podsumowanie
- Funkcja jednowyrażeniowa zastępuje
{ return wyrażenie }zapisem= wyrażenie. - Po
=podajemy jedno wyrażenie – bez klamr i bezreturn. - Typ zwracany zwykle pomijamy – Kotlin rozpoznaje go z wyrażenia (inferencja).
- Przy złożonym wyrażeniu warto typ jednak zapisać dla czytelności.
ifiwhen(jako wyrażenia) świetnie sprawdzają się jako ciało skróconej funkcji.- Wiele instrukcji, pętla lub kilka zmiennych → wróć do zapisu blokowego
{ ... }.
Zadania do wykonania
Zadania wykonaj w Kotlin Playground (play.kotlinlang.org).
Weź funkcję blokową fun kwadrat(x: Int): Int { return x * x }
i przepisz ją na postać jednowyrażeniową.
Napisz jednowyrażeniowo funkcje: szescian(x) (sześcian liczby) oraz
powitanie(imie) (zwraca tekst powitania). Wywołaj obie.
Napisz jednowyrażeniową funkcję wiekszy(a, b) zwracającą większą
z dwóch liczb – wykorzystaj if jako wyrażenie w ciele funkcji.
Napisz jednowyrażeniową funkcję ocenaSlowna(punkty: Int), która na
podstawie liczby punktów (0–100) zwraca ocenę słowną – użyj when
z zakresami jako ciała funkcji. Przetestuj na kilku wartościach.